Rendu complexe de bloc via TESR



  • Introduction

    Qu'est-ce qu'un rendu TESR ?

    TESR signifie TileEntitySpecialRenderer, c'est ce que nous allons utiliser pour notre rendu dans le monde. Pour l'inventaire, nous devront passer par un rendu ISBRH.
    Un rendu TESR est plus complexe et va passer par un TileEntity

    Les avantages du TESR :

    • Permet de faire des rendus animé (exemple : le portal de l'end, les réservoirs et la raffinerie de buildcraft, etc …)
    • Simple à utiliser à l'aide d'un modèle techne.
    • Interaction facile avec le TileEntity associer.

    Les désavantages du TESR :

    • Le rendu est mit à jour à chaque tick, il est donc lourd, il en faut pas en abuser.
    • Nécessite un TileEntity
    • Beaucoup de classe, plus encore comme nous devrons utiliser un rendu ISBRH pour l'inventaire (le TESR ne fait que le rendu sur le monde)

    Ce rendu est donc très intéressant pour faire quelque chose en fonction de votre tileEntity. Si votre bloc n'a pas de TileEntity, le rendu via ISBRH est plus intéressant, sauf si vous voulez utiliser un modèle techne.

    Prérequis

    Adapter le modèle techne

    Une fois votre modèle exporté en java, il faut modifier quelques trucs dedans. Placez la classe du modèle dans votre package client puis changez la déclaration de package. Ensuite faite ctrl + shift + o pour mettre à jour les importations (prenez toujours net.minecraft.quelque chose)
    Tout à la fin de la classe, supprimez la fonction setRotationAngles.
    Ensuite modifier la méthode render, supprimer tous les paramètres sauf le dernier, nommé-le juste f. Modifier ensuite le paramètre des Shape.render en f. Exemple :

        public void render(float f)
        {
            Shape1.render(f);
            Shape2.render(f);
            Shape3.render(f);
            Shape4.render(f);
            Shape5.render(f);
            Shape6.render(f);
        }
    

    La classe du bloc

    Si vous avez bien suivi les prérequis, votre classe devrait ressembler à ça :

    package tutoriel.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.world.World;
    
    public class BlockSculpture extends Block
    {
        public BlockSculpture(int id)
        {
            super(id, Material.rock);
        }
    
        public TileEntity createTileEntity(World world, int metadata)
        {
            return new TileEntitySculpture();
        }
    
        public boolean hasTileEntity(int metadata)
        {
            return true;
        }
    }
    

    Ajoutez ces trois fonctions :

        public boolean renderAsNormalBlock()
        {
            return false;
        }
    
        public boolean isOpaqueCube()
        {
            return false;
        }
    
        @SideOnly(Side.CLIENT)
        public int getRenderType()
        {
            return TutoClientProxy.renderInventoryTESRId;
        }
    

    La première fonction dit que notre bloc n'est pas un cube de 1x1. La deuxième indique de notre bloc n'est pas opaque (pour les blocs ayant une textures transparente ou un rendu ne faisant pas 1x1) et la dernière unique l'id du rendu pour le rendu en main.

    ClientProxy + classe principale + interface

    Dans votre proxy client, déclarez l'int renderInventoryTESRId :

        public static int renderInventoryTESRId;
    

    Dans la méthode registerRender() ajoutez :

        renderInventoryTESRId = RenderingRegistry.getNextAvailableRenderId();
        RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer());
    

    Créez la classe TESRInventoryRenderer, nous allons nous en occuper après.

    Toujours dans le ClientProxy, créez une nouvelle méthode registerTileEntityRender :

        @Override
        public void registerTileEntityRender()
        {
    
        }
    

    N'oubliez pas d'ajouter cette même méthode sans le @Override dans le CommonProxy.

    Allez dans votre classe principale, dans la méthode init, après proxy.registerRender(); ajoutez :

        proxy.registerTileEntityRender();
    

    N'oubliez pas d'enregistrer votre TileEntity si ce n'est pas déjà fait :

        GameRegistry.registerTileEntity(TileEntitySculpture.class, "Sculpture");
    

    Retournez dans votre ClientProxy, et dans la méthode registerTileEntityRender que nous venons de créer ajoutez :

        ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture.class, new TileEntitySculptureSpecialRender());
    

    Vous pouvez déjà créez la classe TileEntitySculptureSpecialRender dans votre package client.

    Dans votre package client, créez une nouvelle interface IInventoryRenderer :

    package tutoriel.client;
    
    public interface IInventoryRenderer
    {
        public void renderInventory(double x, double y, double z);
    }
    

    Chaque TESR devra être implémenté de cette interface.

    La classe du rendu de tileEntity

    Cette classe doit hériter de TileEntitySpecialRenderer pour le rendu sur le monde et être implémenté de IInventoryRenderer pour le rendu en main.

        public class TileEntitySculptureSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer
    

    Ajoutez un constructeur à la classe, faite un petit ctrl + shift + o et un "add unimplemented methods" et on a :

    package tutoriel.client;
    
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.tileentity.TileEntity;
    
    public class TileEntitySculptureSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer
    {
        public TileEntitySculptureSpecialRender()
        {
    
        }
    
        @Override
        public void renderInventory(double x, double y, double z)
        {
    
        }
    
        @Override
        public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick)
        {
    
        }
    }
    

    Ajoutez une nouvelle méthode :

        public void renderTileEntitySculptureAt(TileEntitySculpture te, double x, double y, double z, float tick)
        {
    
        }
    

    TileEntitySculpture est le nom du TileEntity que je veux rendre.
    Dans la méthode renderTileEntityAt ajoutez : "this.renderTileEntitySculptureAt((TileEntitySculpture)te, x, y, z, tick);" et dans renderInventory ajoutez : "this.renderTileEntitySculptureAt(null, x, y, z, 0.0F);". Cela donne :

        @Override
        public void renderInventory(double x, double y, double z)
        {
            this.renderTileEntitySculptureAt(null, x, y, z, 0.0F);
        }
    
        @Override
        public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick)
        {
            this.renderTileEntitySculptureAt((TileEntitySculpture)te, x, y, z, tick);
        }
    

    Au dessus du constructeur déclarez un field d'objet ResourceLocation en publique, statique et final, et un d'objet de votre modèle en privé et finale et ajoutez dans le constructeur la fonction "this.setTileEntityRenderer(TileEntityRenderer.instance);". On obtient :

        private final ModelTutorial model = new ModelTutorial();
        public static final ResourceLocation textureLocation = new ResourceLocation("modtutoriel", "textures/blocks/modelTutoriel.png");
        public TileEntitySculptureSpecialRender()
        {
            this.setTileEntityRenderer(TileEntityRenderer.instance);
        }
    

    Explication : On instancie notre modèle, on déclare notre ResourceLocation (la texture sera dans assets/modtutoriel/textures/blocks/modelTutoriel.png) puis dans le constructeur on initialise le TileEntityRenderer. Très important sinon vous allez avoir des NPE.

    Maintenant dans la fonction renderTileEntitySculptureAt.

            GL11.glPushMatrix();
            GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F);
            this.bindTexture(textureLocation);
            GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
            this.model.render(0.0625F);
            GL11.glPopMatrix();
    

    Lancez votre jeu en debug (le scarabée à gauche de run) pour tester le rendu sur le monde (il ne se fait pas encore dans l'inventaire), si vous avez fait votre modèle sur la planche en bois sur techne, le modèle devrait s'afficher correctement, si ce n'est pas le cas, modifiez la valeur y + 1.5F dans "GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F);" (le changement sera fait en directe lorsque vous sauvegarderez, c'est l'intérêt du debug).

    Le rendu en main

    Notre ISBRH est encore vide, nous allons le compléter. Le code avec interface que j'ai fait (en me basant sur celui de buildcraft) permet d'avoir un seul ISBRH pour tout vos rendus TESR.
    Cela veut dire que si vous souhaitez ajouter un deuxième, puis un troisième, etc. rendu via TileEntitySpecialRenderer, il vous suffira de remettre le même id de rendu que pour les autres, et utiliser le même ISBRH. Si c'est pas clair pour vous, allez dans la parti bonus, et suivez les instructions de "ajouter plusieurs rendus via TileEntitySpecialRenderer".

    Donc dans la classe TESRInventoryRenderer, changez

        @Override
        public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
        {
            return false;
        }
    
        @Override
        public boolean shouldRender3DInInventory()
        {
            return false;
        }
    
        @Override
        public int getRenderId()
        {
            return 0;
        }
    

    en :

        @Override
        public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
        {
            return true;
        }
    
        @Override
        public boolean shouldRender3DInInventory()
        {
            return true;
        }
    
        @Override
        public int getRenderId()
        {
            return TutoClientProxy.renderInventoryTESRId;
        }
    

    En haut de la classe, ajoutez :

        public static class TESRIndex
        {
            Block block;
            int metadata;
    
            public TESRIndex(Block block, int metadata)
            {
                this.block = block;
                this.metadata = metadata;
            }
    
            @Override
            public int hashCode()
            {
                return block.hashCode() + metadata;
            }
    
            @Override
            public boolean equals(Object o)
            {
                if(!(o instanceof TESRIndex))
                return false;
    
                TESRIndex tesr = (TESRIndex)o;
    
                return tesr.block == block && tesr.metadata == metadata;
            }
        }
    
        public static HashMap<TesrIndex, IInventoryRenderer> blockByTESR = new HashMap<TesrIndex, IInventoryRenderer>();
    

    TESRIndex est une classe qui va servir pour nos rendus dans l'inventaire / en main. Dans son constructeur elle prend l'objet du bloc et son metadata.
    Ensuite dans la HashMap nous allons enregistrer nos rendus d'inventaire. Dans la fonction renderInventoryBlock, ajoutez :

        TESRIndex index = new TESRIndex(block, metadata);
        if(blockByTESR.containsKey(index))
        {
            blockByTESR.get(index).renderInventory(-0.5, -0.5, -0.5);
        }
    

    A chaque fois qu'un rendu dans l'inventaire d'id renderInventoryTESRId est initialisé, on créé un nouveau TESRIndex, et si ce TESRIndex existe dans la HashMap blockByTESR, on fait le rendu.

    Finitions + rendu final

    À nouveau dans votre ClientProxy, dans la méthode registerTileEntityRender() ajoutez :

        TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 0), new TileEntitySculptureSpecialRender());
    

    ModTutoriel.blockSculpture est l'objet de mon bloc et 0 le metadata.

    Lance votre jeu, le rendu en main / dans l'inventaire devrait se faire.
    Exemple rendu TESR
    (oui, modèle fait à l'arrache)

    Bonus / Pour aller plus loin

    Les particules :
    Vous avez surement remarqué que les particules sont noirs et rose, comme avec un missing texture. Pour résoudre ce problème, il suffit d’attribuer un icône a votre bloc avec la méthode setTextureName que nous avons vu dans un bloc basique. Pour un bloc déjà existant, vous pouvez utiliser la fonction getIcon dans la classe de votre bloc. Par exemple avec :

        public Icon getIcon(int side, int metadata)
        {
            return Block.blockIron.getIcon(0, 0);
        }
    

    mon bloc aura les particules du bloc de fer.

    Ajoutez plusieurs rendus via TileEntitySpecialRenderer
    Si vous lisez cette partie, c'est que vous n'avez pas compris mes explications plus haut. En fait il vous suffit de un autre bloc et une autre entité de bloc et une autre TileEntitySpecialRenderer. (ou alors juste une entité de bloc sur metadata avec une TileEntitySpecialRenderer).
    Si vous faite un deuxième bloc, dans la fonction

        @SideOnly(Side.CLIENT)
        public int getRenderType()
        {
            return TutoClientProxy.renderInventoryTESRId;
        }
    

    Remettez la même chose, ne recréer pas un id de rendu. Comme je l'ai expliqué plus haut, on utilise un seul ISimpleBlockRenderingHandler (nommé TESRInventoryRenderer) pour tout nos rendus en main de TileEntitySpecialRenderer.
    N'oubliez pas les fonctions dans le proxy client.
    Par exemple, si j'ai 3 TESR sur un bloc en metadata et un quatrième sur un autre bloc, je vais avoir :

    • 2 blocs
    • 4 TileEntity
    • 4 TileEntitySpecialRenderer
    • 1 seul TileEntitySpecialRenderer
      et mon client proxy ressemblera à ça :
        public static int renderInventoryTESRId;
        public void registerRender()
        {
            renderInventoryTESRId = RenderingRegistry.getNextAvailableRenderId();
            RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer());
        }
    
        @Override
        public void registerTileEntityRender()
        {
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture.class, new TileEntitySculptureSpecialRender());
            TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 0), new TileEntitySculptureSpecialRender());
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture2.class, new TileEntitySculptureSpecialRender2());
            TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 1), new TileEntitySculptureSpecialRender2());
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySculpture3.class, new TileEntitySculptureSpecialRender3());
            TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockSculpture, 2), new TileEntitySculptureSpecialRender3());
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTuto.class, new TileEntityTutoSpecialRender());
            TESRInventoryRenderer.blockByTESR.put(new TESRIndex(ModTutoriel.blockTuto, 0), new TileEntityTutoSpecialRender());
        }
    

    Voila, j'espère que c'est plus clair comme ça 😉

    Sinon, il y a un exemple ici

    Tourner votre modèle en fonction de la direction :
    Comme nous avons besoin d'un tileEntity, autant sauvegarder la direction dedans. Suivez donc à la lettre la partie "Sur un bloc avec metadata" du tutoriel Direction de bloc. Ignorez juste la méthode getBlockTexture(IBlockAccess blockaccess, int x, int y, int z, int side), elle ne servira à rien comme la texture est sur le TESR.
    Ensuite allez dans votre TileEntitySpecialRenderer, et dans la méthode renderTileEntityQuelqueChoseAt, ajoutez avant " this.model.render(0.0625F);" :

            if(te != null)
            {
                GL11.glRotatef(90F * te.getDirection(), 0.0F, 1.0F, 0.0F);
            }
    

    Ce qui donne au final :

        public void renderTileEntitySculptureAt(TileEntitySculpture te, double x, double y, double z, float tick)
        {
            GL11.glPushMatrix();
            GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F);
            this.bindTexture(textureLocation);
            GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
            if(te != null)
            {
                GL11.glRotatef(90F * te.getDirection(), 0.0F, 1.0F, 0.0F);
            }
            this.model.render(0.0625F);
            GL11.glPopMatrix();
        }
    

    Et voila, maintenant en fonction de la direction du joueur lors du placement, le rendu va tourner !

    Voir le commit sur github



  • Un tutoriel qui peut sembler compliqué, mais très bien expliqué et simple a suivre !

    GG 🙂



  • Super tuto , mais j'ai une erreur a :

    protected static final ResourceLocation texture = new ResourceLocation("mods/prototypeMod:textures/blocks/Prot.png");
    

    Et il me dit :

    PS : je suis en 1.5.2 , cela vient peut-être de la ?




  • Administrateurs

    J'ai juste changé le titre car on peut aussi faire des rendus de bloc avec ISimpleBlockRenderingHandler.
    Il faudrait aussi faire un tutoriel sur l'orientation du rendu en fonction de la rotation (un tag NTB dans le tileEntity comme les directions avec metadata).

    En passant, pas besoin de prérequis comme je mets les tutoriels dans le menu principale dans l'ordre, après si tu veux vraiment les mettre laisses-les ^^.



  • Sinon , tu pourrais dire comment faire pour avoir le rendu dans la main et faire disparaitre le block en dessous ?
    Car ( pour moi en tout cas ) je vois le block ( carré sans model ) dans le model , et dans ma main , c'est juste un cube et non pas le model …


  • Administrateurs

    @'Nolan-XX':

    faire disparaitre le block en dessous ?

    Comment ça o_O ?

    Pour le rendu en main c'est plutôt complexe, je regarderai quand j'aurai le temps.



  • @'robin4002':

    @'Nolan-XX':

    faire disparaitre le block en dessous ?

    Comment ça o_O ?

    Pour le rendu en main c'est plutôt complexe, je regarderai quand j'aurai le temps.

    Bah ça :


  • Administrateurs

    Heu ça c'est pas normal, tu t'en planté quelque part, ou tu as fail ton modèle.



  • ça vient pas du model , et j'ai suivi le tuto a la lettre … :s



  • Je ne sais pas si c'est moi qui n'est pas bon, mais a chaque fois que j'esseye de faire ce tuto au complet, j'ai toujours un erreur quelque part. Cette fois j'en est eu une dans le "Client.proxy", dans la "render" je croit, il y avait un ".func….." qui ne marchai pas et moi les "proxy.render" ne marche pas, je doit les ecrire comme sa "proxy.renderers". quelqu'un peut m'aider parce que j'aimerai vraiment pouvoir finir se tuto et me faire un bloc avec un render techne xD 🙂 merci d'avance



  • Comment s'appelle la fonction dans ton proxy ?
    là tu appelles une variable, il faut faire proxy.taFonction().



  • je sais pas vraiment si c'est de sa que tu parle, vu que sa ne fait que environ 1 mois que j'ai commencer à modder, mais dans mon Clientproxy j'ai ça :

    package bitegab;
    
    import cpw.mods.fml.client.registry.ClientRegistry;
    import net.minecraftforge.client.MinecraftForgeClient;
    
    public class ClientProxy extends CommonProxy
    {
    @Override
    public void registerRenderers()
    {
    //ici mes futur client registry
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTutorialTechne.class, TileEntityTutorialTechneRender.class);
    }
    
    }
    


  • Mets des balises pour tes codes si il te plais.
    Merci.


  • Administrateurs

    On peut avoir ta classe principale ?

    (PS : j'ai édité ton poste pour le code java, et celui de sevenno pour l'orthographe)



  • Quesqu'une balise? et voici ma classe principale: ```java

    package minecraftplus;

    import net.minecraft.block.Block;
    import net.minecraft.block.BlockOre;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.crafting.FurnaceRecipes;
    import net.minecraft.potion.Potion;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.oredict.OreDictionary;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.network.NetworkMod;
    import cpw.mods.fml.common.network.NetworkRegistry;
    import cpw.mods.fml.common.registry.GameRegistry;
    import cpw.mods.fml.common.registry.LanguageRegistry;

    @Mod(modid="MinePlus", name="Minecraft+", version="MV.1.6.2-VM.1.0.0")
    @NetworkMod(clientSideRequired=true, serverSideRequired=false, channels = "TutoMod", packetHandler = TutPacketHandler.class) // NE PAS MODIFIER CETTE LIGNE!!!!!!!!!!!

    public class minecraftplusmain {
    @SidedProxy(clientSide = "minecraftplus.ClientProxy", serverSide = "minecraftplus.CommonProxy")
    public static minecraftplus.CommonProxy proxy;

    @Instance("MinePlus")
    public static minecraftplusmain instance = new minecraftplusmain();

    //creativeTabs static
    public static CreativeTabs MinecraftplusTabs = new MinecraftplusTabs(CreativeTabs.getNextID(), "Minecraftplus Mod Tabs");

    //block static
    public static Block platine, cr, BlockPlatine, thallium, phosphore, blockphosphore1, blockphosphore2, blockphosphore3, blockphosphore4, blockphosphore5, gallium, polonium, BlockGallium, BlockPolonium, BlockThallium, StoneFuel ;

    //item static
    public static Item moulear, moulearc, moulearp, platine1, platine2, platine3, platine4, platine5, rc, cs, gr, ch, platinein, ss, sh, is, lameferraf, tetepiocheferraf, tetehacheferraf, tetepelleferraf, moulearth, thallium1, thallium2, thalliumin, moulearpo, polonium1, polonium2, poloniumin, moulearga, gallium1, gallium2, galliumin, phosphoredust, Legouteur, BottleFuel ;

    //other static
    public static Block TutFurnaceIdle;
    public static Block TutFurnaceBurning;
    private GuiHandler guihandler = new GuiHandler();

    @EventHandler
    public void PreInit(FMLPreInitializationEvent event)
    {

    //Configuration

    //Blocks

    cr = new cr(2001).setHardness(4.0F).setResistance(14.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Cobblestone renforcee").func_111022_d("rm:cr");
    GameRegistry.registerBlock(cr, "cr");
    LanguageRegistry.addName(cr, "Cobblestone renforcee");

    //four 500C

    TutFurnaceIdle = new TutFurnace(1000, false).setHardness(3.5F).setUnlocalizedName("Ore Furnace 500C");
    TutFurnaceBurning = new TutFurnace(1001, true).setHardness(3.5F).setUnlocalizedName("Ore Furnace 500C Burning").setLightValue(0.4F);
    GameRegistry.registerBlock(TutFurnaceIdle, "Tutorial.FurnaceIdle");
    GameRegistry.registerBlock(TutFurnaceIdle, "Tutorial.FurnaceBurning");
    GameRegistry.registerTileEntity(TileEntityTutFurnace.class, "tileentitytutfurnace");
    NetworkRegistry.instance().registerGuiHandler(this, guihandler);
    LanguageRegistry.addName(TutFurnaceIdle, "Ore Furnace 500C");
    LanguageRegistry.addName(TutFurnaceBurning, "Ore Furnace 500C Burning");

    //ore

    StoneFuel = new StoneFuel(2015).setHardness(8.0F).setResistance(1.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("StoneFuel").func_111022_d("rm:StoneFuel");
    polonium = new polonium(2011).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Polonium").func_111022_d("rm:polonium");
    phosphore = new phosphore(2004).setHardness(2.0F).setResistance(2.0F).setLightValue(0.4F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Phosphore").func_111022_d("rm:phosphore");
    platine = new platine(2000).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Platine").func_111022_d("rm:platine");
    thallium = new thallium(2003).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Thallium").func_111022_d("rm:thallium");
    gallium = new gallium(2010).setHardness(3.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Gallium").func_111022_d("rm:gallium");
    GameRegistry.registerBlock(StoneFuel, "StoneFuel");
    GameRegistry.registerBlock(phosphore, "phosphore");
    GameRegistry.registerBlock(platine, "platine");
    GameRegistry.registerBlock(thallium, "thallium");
    GameRegistry.registerBlock(gallium, "gallium");
    GameRegistry.registerBlock(polonium, "polonium");
    LanguageRegistry.addName(StoneFuel, "StoneFuel");
    LanguageRegistry.addName(phosphore, "Phosphore");
    LanguageRegistry.addName(platine, "Platine");
    LanguageRegistry.addName(thallium, "Thallium");
    LanguageRegistry.addName(gallium, "Gallium");
    LanguageRegistry.addName(polonium, "Polonium");

    //phosphore

    blockphosphore1 = new blockphosphore1(2005).setHardness(3.0F).setResistance(4.0F).setLightValue(0.2F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Block de Phosphore L1").func_111022_d("rm:phosphore1");
    blockphosphore2 = new blockphosphore2(2006).setHardness(3.0F).setResistance(4.0F).setLightValue(0.4F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Block de Phosphore L2").func_111022_d("rm:phosphore2");
    blockphosphore3 = new blockphosphore3(2007).setHardness(3.0F).setResistance(4.0F).setLightValue(0.6F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Block de Phosphore L3").func_111022_d("rm:phosphore3");
    blockphosphore4 = new blockphosphore4(2008).setHardness(3.0F).setResistance(4.0F).setLightValue(0.8F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Block de Phosphore L4").func_111022_d("rm:phosphore4");
    blockphosphore5 = new blockphosphore5(2009).setHardness(3.0F).setResistance(4.0F).setLightValue(1.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Block de Phosphore L5").func_111022_d("rm:phosphore5");
    phosphoredust = new moulearc(1232).setUnlocalizedName("Poudre de Phosphore").func_111206_d("rm:phosphoredust");
    GameRegistry.registerBlock(blockphosphore1, "blockphosphore1");
    GameRegistry.registerBlock(blockphosphore2, "blockphosphore2");
    GameRegistry.registerBlock(blockphosphore3, "blockphosphore3");
    GameRegistry.registerBlock(blockphosphore4, "blockphosphore4");
    GameRegistry.registerBlock(blockphosphore5, "blockphosphore5");
    GameRegistry.registerItem(phosphoredust, "phosphoredust");
    LanguageRegistry.addName(blockphosphore1, "Block de Phosphore L1");
    LanguageRegistry.addName(blockphosphore2, "Block de Phosphore L2");
    LanguageRegistry.addName(blockphosphore3, "Block de Phosphore L3");
    LanguageRegistry.addName(blockphosphore4, "Block de Phosphore L4");
    LanguageRegistry.addName(blockphosphore5, "Block de Phosphore L5");
    LanguageRegistry.addName(phosphoredust, "Poudre de Phosphore");

    //Items

    BottleFuel= new BottleFuel(1234).setUnlocalizedName("Bouteille de gaz").func_111206_d("rm:BottleFuel");
    Legouteur = new Legouteur(1233).setUnlocalizedName("Goudrelle").setFull3D().func_111206_d("rm:Legouteur");
    moulear = new moulear(1200).setUnlocalizedName("Moule d'Argile").func_111206_d("rm:moulear");
    moulearc = new moulearc(1201).setUnlocalizedName("Moule d'argile Cuit").func_111206_d("rm:moulearc");
    rc = new rc(1209).setUnlocalizedName("Reservoir de Chaleur").func_111206_d("rm:rc");
    cs = new cs(1210).setUnlocalizedName("Cobblestone Stick").setFull3D().func_111206_d("rm:cs");
    gr = new cs(1211).setUnlocalizedName("Grille de Cobblestone").func_111206_d("rm:gr");
    ch = new ch(1212).setUnlocalizedName("Cobblestone Hammer").setFull3D().func_111206_d("rm:ch");
    ss = new ss(1213).setUnlocalizedName("Stone Stick").setFull3D().func_111206_d("rm:ss");
    sh = new sh(1214).setUnlocalizedName("Stone Hammer").setFull3D().func_111206_d("rm:sh");
    is = new is(1215).setUnlocalizedName("Iron Stick").setFull3D().func_111206_d("rm:is");
    GameRegistry.registerItem(BottleFuel, "BottleFuel");
    GameRegistry.registerItem(Legouteur, "Legouteur");
    GameRegistry.registerItem(moulear, "moule");
    GameRegistry.registerItem(moulearc, "moulearc");
    GameRegistry.registerItem(rc, "rc");
    GameRegistry.registerItem(cs, "cs");
    GameRegistry.registerItem(gr, "gr");
    GameRegistry.registerItem(ch, "ch");
    GameRegistry.registerItem(ss, "ss");
    GameRegistry.registerItem(sh, "sh");
    GameRegistry.registerItem(is, "is");
    LanguageRegistry.addName(BottleFuel, "Bouteille de gaz");
    LanguageRegistry.addName(Legouteur, "Goudrelle");
    LanguageRegistry.addName(moulear, "Moule d'Argile");
    LanguageRegistry.addName(moulearc, "Moule d'argile Cuit");
    LanguageRegistry.addName(rc, "Reservoir de Chaleur");
    LanguageRegistry.addName(cs, "Cobblestone Stick");
    LanguageRegistry.addName(gr, "Grille de Cobblestone");
    LanguageRegistry.addName(ch, "Cobblestone Hammer");
    LanguageRegistry.addName(ss, "Stone Stick");
    LanguageRegistry.addName(sh, "Stone Hammer");
    LanguageRegistry.addName(is, "Iron Stick");

    //Gallium

    BlockGallium = new BlockGallium(2012).setHardness(5.0F).setResistance(5.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName("Block de Gallium").func_111022_d("rm:BlockGallium");
    moulearga = new moulearth(1228).setUnlocalizedName("Moule de Gallium").func_111206_d("rm:moulearga");
    gallium1 = new thallium1(1229).setUnlocalizedName("Gallium [1/2]C").func_111206_d("rm:gallium1");
    gallium2 = new thallium2(1230).setUnlocalizedName("Gallium Liquide").func_111206_d("rm:gallium2");
    galliumin = new thalliumin(1231).setUnlocalizedName("Gallium Ingot").func_111206_d("rm:galliumin");
    GameRegistry.registerItem(moulearga, "moulearga");
    GameRegistry.registerItem(gallium1, "gallium1");
    GameRegistry.registerItem(gallium2, "gallium2");
    GameRegistry.registerItem(galliumin, "galliumin");
    GameRegistry.registerBlock(BlockGallium, "BlockGallium");
    LanguageRegistry.addName(moulearga, "Moule de Gallium");
    LanguageRegistry.addName(gallium1, "Gallium [1/2]C");
    LanguageRegistry.addName(gallium2, "Gallium Liquide");
    LanguageRegistry.addName(galliumin, "Gallium Ingot");
    LanguageRegistry.addName(BlockGallium, "Block de Gallium");

    //Polonium

    BlockPolonium = new BlockGallium(2013).setHardness(5.0F).setResistance(5.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName("Block de Polonium").func_111022_d("rm:BlockPolonium");
    moulearpo = new moulearth(1224).setUnlocalizedName("Moule de Polonium").func_111206_d("rm:moulearpo");
    polonium1 = new thallium1(1225).setUnlocalizedName("Polonium [1/2]C").func_111206_d("rm:polonium1");
    polonium2 = new thallium2(1226).setUnlocalizedName("Polonium Liquide").func_111206_d("rm:polonium2");
    poloniumin = new thalliumin(1227).setUnlocalizedName("Polonium Ingot").func_111206_d("rm:poloniumin");
    GameRegistry.registerItem(moulearpo, "moulearpo");
    GameRegistry.registerItem(polonium1, "polonium1");
    GameRegistry.registerItem(polonium2, "polonium2");
    GameRegistry.registerItem(poloniumin, "poloniumin");
    GameRegistry.registerBlock(BlockPolonium, "BlockPolonium");
    LanguageRegistry.addName(moulearpo, "Moule de Polonium");
    LanguageRegistry.addName(polonium1, "Polonium [1/2]C");
    LanguageRegistry.addName(polonium2, "Polonium Liquide");
    LanguageRegistry.addName(poloniumin, "Polonium Ingot");
    LanguageRegistry.addName(BlockPolonium, "Block de Polonium");

    //Thallium

    BlockThallium = new BlockThallium(2014).setHardness(5.0F).setResistance(5.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName("Block de Thallium").func_111022_d("rm:BlockThallium");
    moulearth = new moulearth(1220).setUnlocalizedName("Moule de Thallium").func_111206_d("rm:moulearth");
    thallium1 = new thallium1(1221).setUnlocalizedName("Thallium [1/2]C").func_111206_d("rm:thallium1");
    thallium2 = new thallium2(1222).setUnlocalizedName("Thallium Liquide").func_111206_d("rm:thallium2");
    thalliumin = new thalliumin(1223).setUnlocalizedName("Thallium Ingot").func_111206_d("rm:thalliumin");
    GameRegistry.registerItem(moulearth, "moulearth");
    GameRegistry.registerItem(thallium1, "thallium1");
    GameRegistry.registerItem(thallium2, "thallium2");
    GameRegistry.registerItem(thalliumin, "thalliumin");
    GameRegistry.registerBlock(BlockThallium, "BlockThallium");
    LanguageRegistry.addName(moulearth, "Moule de Thallium");
    LanguageRegistry.addName(thallium1, "Thallium [1/2]C");
    LanguageRegistry.addName(thallium2, "Thallium Liquide");
    LanguageRegistry.addName(thalliumin, "Thallium Ingot");
    LanguageRegistry.addName(BlockThallium, "Block de Thallium");

    //Platine

    moulearp = new moulearp(1202).setUnlocalizedName("Moule de Platine").func_111206_d("rm:moulearp");
    platine1 = new platine1(1203).setUnlocalizedName("Platine [1/5]C").func_111206_d("rm:platine1");
    platine2 = new platine2(1204).setUnlocalizedName("Platine [2/5]C").func_111206_d("rm:platine2");
    platine3 = new platine3(1205).setUnlocalizedName("Platine [3/5]C").func_111206_d("rm:platine3");
    platine4 = new platine4(1206).setUnlocalizedName("Platine [4/5]C").func_111206_d("rm:platine4");
    platine5 = new platine5(1207).setUnlocalizedName("Platine Liquide").func_111206_d("rm:platine5");
    platinein = new platinein(1208).setUnlocalizedName("Platine Ingot").func_111206_d("rm:platinein");
    BlockPlatine = new BlockPlatine(2002).setHardness(8.0F).setResistance(10.0F).setStepSound(Block.soundMetalFootstep).setUnlocalizedName("Block de Platine").func_111022_d("rm:BlockPlatine");
    GameRegistry.registerItem(moulearp, "moulearp");
    GameRegistry.registerItem(platine1, "platine1");
    GameRegistry.registerItem(platine2, "platine2");
    GameRegistry.registerItem(platine3, "platine3");
    GameRegistry.registerItem(platine4, "platine4");
    GameRegistry.registerItem(platine5, "platine5");
    GameRegistry.registerItem(platinein, "platinein");
    GameRegistry.registerBlock(BlockPlatine, "BlockPlatine");
    LanguageRegistry.addName(moulearp, "Moule de Platine");
    LanguageRegistry.addName(platine1, "Platine [1/5]C");
    LanguageRegistry.addName(platine2, "Platine [2/5]C");
    LanguageRegistry.addName(platine3, "Platine [3/5]C");
    LanguageRegistry.addName(platine4, "Platine [4/5]C");
    LanguageRegistry.addName(platine5, "Platine liquide");
    LanguageRegistry.addName(platinein, "Platine Ingot");
    LanguageRegistry.addName(BlockPlatine, "Block de Platine");

    //raffine

    tetepelleferraf = new tetepelleferraf(1217).setUnlocalizedName("Tete de pelle en fer Raffinee").func_111206_d("rm:tetehacheferraf");
    tetehacheferraf = new tetehacheferraf(1216).setUnlocalizedName("Tete de hache en fer Raffinee").func_111206_d("rm:tetehacheferraf");
    tetepiocheferraf = new tetepiocheferraf(1218).setUnlocalizedName("Tete de pioche en fer Raffinee").func_111206_d("rm:tetepiocheferraf");
    lameferraf = new lameferraf(1219).setUnlocalizedName("Lame de fer Raffinee").func_111206_d("rm:lameferraf");
    GameRegistry.registerItem(tetepelleferraf, "tetepelleferraf");
    GameRegistry.registerItem(tetehacheferraf, "tetehacheferraf");
    GameRegistry.registerItem(tetepiocheferraf, "tetepiocheferraf");
    GameRegistry.registerItem(lameferraf, "lameferraf");
    LanguageRegistry.addName(tetepelleferraf, "Tete de pelle en fer Raffinee");
    LanguageRegistry.addName(tetehacheferraf, "Tete de hache en fer Raffinee");
    LanguageRegistry.addName(tetepiocheferraf, "Tete de pioche en fer Raffinee");
    LanguageRegistry.addName(lameferraf, "Lame de fer Raffinee");

    }

    @EventHandler
    public void Init(FMLInitializationEvent event)
    {
    //Registry

    GameRegistry.registerWorldGenerator(new oregeneration());
    GameRegistry.registerCraftingHandler(new chHandler());
    GameRegistry.registerCraftingHandler(new shHandler());
    GameRegistry.registerCraftingHandler(new LegouteurHandler());

    //Mobs

    //Render
    proxy.registerRenderers();

    //NetWork

    //Recipe

    GameRegistry.addRecipe(new ItemStack(moulear, 2), new Object[]{"ZZZ", "YZY", "YYY", 'Y', new ItemStack(Item.clay)});
    GameRegistry.addRecipe(new ItemStack(rc), new Object[]{"ZAZ", "ZAZ", "ZZZ", 'Z', cr});
    GameRegistry.addRecipe(new ItemStack(cr, 4), new Object[]{"ZYZ", "YYY", "ZYZ", 'Y', new ItemStack(Block.cobblestone), 'Z', new ItemStack(Block.gravel)});
    GameRegistry.addRecipe(new ItemStack(cs, 2), new Object[] {"#", "#", '#', new ItemStack(Block.cobblestone, 1, 0)});
    GameRegistry.addRecipe(new ItemStack(gr), new Object[]{"XXX", "ZZZ", "ZZZ", 'Z', cs});
    GameRegistry.addRecipe(new ItemStack(ss, 2), new Object[] {"#", "#", '#', new ItemStack(Block.stone, 1, 0)});
    GameRegistry.addRecipe(new ItemStack(TutFurnaceIdle), new Object[]{"XXX", "XYX", "XZX", 'X', cr, 'Z', rc, 'Y', gr});
    GameRegistry.addRecipe(new ItemStack(BlockPlatine), new Object[]{"XXX", "XXX", "XXX", 'X', platine5});
    GameRegistry.addRecipe(new ItemStack(BlockGallium), new Object[]{"XXX", "XXX", "XXX", 'X', gallium2});
    GameRegistry.addRecipe(new ItemStack(BlockThallium), new Object[]{"XXX", "XXX", "XXX", 'X', thallium2});
    GameRegistry.addRecipe(new ItemStack(BlockPolonium), new Object[]{"XXX", "XXX", "XXX", 'X', polonium2});
    GameRegistry.addRecipe(new ItemStack(blockphosphore1), new Object[]{"XXX", "XXX", "XXX", 'X', phosphoredust});
    GameRegistry.addRecipe(new ItemStack(blockphosphore2, 4), new Object[] {"XYX", "YYY", "XYX", 'X', blockphosphore1, 'Y', phosphoredust});
    GameRegistry.addRecipe(new ItemStack(blockphosphore3, 4), new Object[] {"XYX", "YYY", "XYX", 'X', blockphosphore2, 'Y', phosphoredust});
    GameRegistry.addRecipe(new ItemStack(blockphosphore4, 4), new Object[] {"XYX", "YYY", "XYX", 'X', blockphosphore3, 'Y', phosphoredust});
    GameRegistry.addRecipe(new ItemStack(blockphosphore5, 4), new Object[] {"XYX", "YYY", "XYX", 'X', blockphosphore4, 'Y', phosphoredust});
    GameRegistry.addRecipe(new ItemStack(is, 2), new Object[] {"#", "#", '#', new ItemStack(Item.ingotIron, 1, 0)});
    GameRegistry.addRecipe(new ItemStack(Legouteur), new Object[] {"YZY", "XXX", "XZY", 'X', cr, 'Z', thalliumin});
    GameRegistry.addShapelessRecipe(new ItemStack(BottleFuel, 1, 0), new ItemStack(Legouteur, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(StoneFuel), new ItemStack(Item.glassBottle));
    GameRegistry.addSmelting(moulear.itemID, new ItemStack(moulearc), 1.2F);

    //raffine_recipes

    GameRegistry.addSmelting(Item.shovelIron.itemID, new ItemStack(tetepelleferraf), 0.5F);
    GameRegistry.addSmelting(Item.swordIron.itemID, new ItemStack(lameferraf), 0.5F);
    GameRegistry.addSmelting(Item.pickaxeIron.itemID, new ItemStack(tetepiocheferraf), 0.5F);
    GameRegistry.addSmelting(Item.axeIron.itemID, new ItemStack(tetehacheferraf), 0.5F);
    GameRegistry.addSmelting(Item.pickaxeIron.itemID, new ItemStack(tetepiocheferraf), 0.5F);

    //Ores_recipes

    GameRegistry.addShapelessRecipe(new ItemStack(moulearp), new Object[]{ new ItemStack(moulearc), new ItemStack(platine5)});
    GameRegistry.addShapelessRecipe(new ItemStack(moulearth), new Object[]{ new ItemStack(moulearc), new ItemStack(thallium2)});
    GameRegistry.addShapelessRecipe(new ItemStack(moulearpo), new Object[]{ new ItemStack(moulearc), new ItemStack(polonium2)});
    GameRegistry.addShapelessRecipe(new ItemStack(moulearga), new Object[]{ new ItemStack(moulearc), new ItemStack(gallium2)});

    //Cobble_Hammer_recipes

    GameRegistry.addRecipe(new ItemStack(ch), new Object[]{"XXX", "XXX", "ZYZ", 'Y', cs, 'X', new ItemStack(Block.cobblestone)});
    GameRegistry.addShapelessRecipe(new ItemStack(platinein, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearp));
    GameRegistry.addShapelessRecipe(new ItemStack(thalliumin, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearth));
    GameRegistry.addShapelessRecipe(new ItemStack(poloniumin, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearpo));
    GameRegistry.addShapelessRecipe(new ItemStack(galliumin, 1, 0), new ItemStack(ch, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearga));

    //Stone_Hammer_recipes

    GameRegistry.addRecipe(new ItemStack(sh), new Object[]{"XXX", "XXX", "ZYZ", 'Y', ss, 'X', new ItemStack(Block.stone)});
    GameRegistry.addShapelessRecipe(new ItemStack(platinein, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearp));
    GameRegistry.addShapelessRecipe(new ItemStack(thalliumin, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearth));
    GameRegistry.addShapelessRecipe(new ItemStack(poloniumin, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearpo));
    GameRegistry.addShapelessRecipe(new ItemStack(galliumin, 1, 0), new ItemStack(sh, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(moulearga));

    //Remove_Recipies

    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreIron.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreGold.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreDiamond.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreCoal.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreEmerald.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreLapis.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreNetherQuartz.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreRedstone.blockID);
    FurnaceRecipes.smelting().getSmeltingList().remove(Block.oreRedstoneGlowing.blockID);

    //Harvest_Level

    MinecraftForge.setBlockHarvestLevel(platine, "pickaxe", 3);
    MinecraftForge.setBlockHarvestLevel(thallium, "pickaxe", 1);
    MinecraftForge.setBlockHarvestLevel(gallium, "pickaxe", 1);
    MinecraftForge.setBlockHarvestLevel(polonium, "pickaxe", 1);
    MinecraftForge.setBlockHarvestLevel(phosphore, "pickaxe", 2);
    }

    @EventHandler
    public void PostInit(FMLPostInitializationEvent event)
    {
    //Integration_avec_les_autres_mods

    }
    }

    ma classe ClientProxy: ```java
    
    package minecraftplus;
    
    import cpw.mods.fml.client.registry.RenderingRegistry;
    
    public class ClientProxy extends CommonProxy {
    @Override
    public void registerRenderers()
    {
    //ici mes futurs client registry
    }
    
    @Override
    public void registerRenderEntity(){
    }
    }
    

    et ma classe CommonProxy: ```java

    package minecraftplus;

    public class CommonProxy {
    public void registerRenderers(){
    }
    public void registerRenderEntity(){
    }
    }


  • Administrateurs

    Je vois pas de problème, tu as juste à mettre :
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTutorialTechne.class, TileEntityTutorialTechneRender.class);
    dans le void registerRenderers et c'est bon.
    Si tu as toujours une erreur, ou est-elle précisément ? Que dit eclipse ?



  • désoler de te poser cette question, mais je ne suis vraiment pas très bon avec les terms de modding, quesque c'est que le void registerRenderers, et je refait le tuto complet maintenant et je poste les erreures ensuite



  • voila, je n'ai pas encore fait la classe du model, mais j'ai déjà des erreurs dans le TileEntityTutorialTechneRender.java:

    
    package minecraftplus;
    
    import org.lwjgl.opengl.GL11;
    
    import net.minecraft.block.Block;
    import net.minecraft.client.renderer.OpenGlHelper;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.entity.Entity;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.util.ResourceLocation;
    import net.minecraft.world.World;
    
    public class TileEntityTutorialTechneRender extends TileEntitySpecialRenderer
    {
    private final ModelBlockTutorielTechne model;
    protected static final ResourceLocation texture = new ResourceLocation("rm:textures/blocks/BlockTechne.png");
    
    public TileEntityTutorialTechneRender()
    {
    this.model = new ModelBlockTutorielTechne();
    }
    
    private void adjustRotatePivotViaMeta(World world, int x, int y, int z)
    {
    int meta = world.getBlockMetadata(x, y, z);
    GL11.glPushMatrix();
    GL11.glRotatef(meta * (-90), 0.0F, 0.0F, 1.0F);
    GL11.glPopMatrix();
    
    }
    
    @Override
    public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float scale)
    {
    this.renderTileEntityAtBlockTutorielTechne((TileEntityTutorialTechne)tileentity,? x, y, z, scale);
    }
    
    public void renderTileEntityAtBlockTutorielTechne(TileEntityTutorialTechne tileentity, double x, double y, double z, float scale)
    {
    
    GL11.glPushMatrix();
    GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F);
    this.func_110628_a(texture);
    GL11.glPushMatrix();
    GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
    this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    GL11.glPopMatrix();
    GL11.glPopMatrix();
    
    }
    
    private void adjustLightFixture(World world, int i, int j, int k, Block block)
    {
    Tessellator tess = Tessellator.instance;
    float brightness = block.getBlockBrightness(world, i, j, k);
    int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
    int modulousModifier = skyLight % 65536;
    int divModifier = skyLight / 65536;
    tess.setColorOpaque_F(brightness, brightness, brightness);
    OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)modulousModifier, divModifier);
    
    }
    }
    
    

    et dans le ClientProxy:

    
    package minecraftplus;
    
    import cpw.mods.fml.client.registry.ClientRegistry;
    import cpw.mods.fml.client.registry.RenderingRegistry;
    
    public class ClientProxy extends CommonProxy {
    @Override
    public void registerRenderers()
    {
    //ici mes futurs client registry
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTutorialTechne.class, new TileEntityTutorialTechneRender());
    }
    
    @Override
    public void registerRenderEntity(){
    }
    }
    
    

    et voici la classe de mon block juste au cas ou:

    
    package minecraftplus;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockContainer;
    import net.minecraft.block.material.Material;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.world.World;
    
    public class BlockTutorial extends BlockContainer
    {
    public BlockTutorial(int par1)
    {
    super(par1, Material.rock);
    this.setCreativeTab(CreativeTabs.tabBlock);
    }
    
    @Override
    public TileEntity createNewTileEntity(World world) {
    return new TileEntityTuto();
    }
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityTutorialTechne();
    }
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return -1;
    }
    }
    
    

    Voici tout se qui ne marche pas:
    -import net.minecraft.tileentity.TileEntitySpecialRenderer;
    -extends TileEntitySpecialRenderer
    -this.model = new ModelBlockTutorielTechne();
    -public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float scale)
    -this.func_110628_a(texture);
    -this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    -.bindTileEntitySpecialRenderer
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    j'espere que vous pourrai m'aider, merci 🙂


  • Administrateurs

    Normal, net.minecraft.tileentity.TileEntitySpecialRenderer; n'existe pas c'est net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;