• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Rendu complexe de bloc via TESR

    Les blocs
    1.6.x
    31
    215
    57960
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • kevin_68
      kevin_68 Moddeurs confirmés last edited by robin4002

      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

      • Un bloc basique
      • Les entités de bloc (TileEntity)
      • Direction de bloc (uniquement si vous souhaitez faire un rendu avec des directions)
      • Un modèle techne (ne suivez que la partie “Création du modèle”)

      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


      Mettez à jours vers la dernière version stable (1.8.9 voir même…

      1 Reply Last reply Reply Quote 0
      • Gugu
        Gugu last edited by

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

        GG 🙂

        "If you have a comprehensive explanation for everything then it decreases uncertainty and anxiety and reduces your cognitive load. And if you can use that simplifying algorithm to put yourself on the side of moral virtue then you’re constantly a good person with a minimum of effort."
        ― Jordan B. Peterson

        1 Reply Last reply Reply Quote 0
        • Nolan-XX
          Nolan-XX last edited by

          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 ?

          1 Reply Last reply Reply Quote 0
          • kevin_68
            kevin_68 Moddeurs confirmés last edited by

            Oui, pas besion de ça en 1.5.2, regarde là:
            https://github.com/MCNanotech/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/main/client/renderer/tileentity/TileEntityLampRender.java


            Mettez à jours vers la dernière version stable (1.8.9 voir même…

            1 Reply Last reply Reply Quote 0
            • robin4002
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

              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 ^^.

              1 Reply Last reply Reply Quote 1
              • Nolan-XX
                Nolan-XX last edited by

                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 …

                1 Reply Last reply Reply Quote 0
                • robin4002
                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                  @‘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.

                  1 Reply Last reply Reply Quote 0
                  • Nolan-XX
                    Nolan-XX last edited by

                    @‘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 :

                    1 Reply Last reply Reply Quote 0
                    • robin4002
                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

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

                      1 Reply Last reply Reply Quote 0
                      • Nolan-XX
                        Nolan-XX last edited by

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

                        1 Reply Last reply Reply Quote 0
                        • F
                          fireblade51 last edited by

                          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

                          1 Reply Last reply Reply Quote 0
                          • Zak
                            Zak last edited by

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

                            1 Reply Last reply Reply Quote 0
                            • F
                              fireblade51 last edited by

                              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);
                              }
                              
                              }
                              
                              1 Reply Last reply Reply Quote 0
                              • S
                                sevenno07 last edited by

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

                                Auteur originale de Sevenno's Addons et de [url=http://www.minecraftfor…

                                1 Reply Last reply Reply Quote 0
                                • robin4002
                                  robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                  On peut avoir ta classe principale ?

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

                                  1 Reply Last reply Reply Quote 0
                                  • F
                                    fireblade51 last edited by

                                    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(){
                                    }
                                    }

                                    1 Reply Last reply Reply Quote 0
                                    • robin4002
                                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                                      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 ?

                                      1 Reply Last reply Reply Quote 0
                                      • F
                                        fireblade51 last edited by

                                        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

                                        1 Reply Last reply Reply Quote 0
                                        • F
                                          fireblade51 last edited by

                                          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 🙂

                                          1 Reply Last reply Reply Quote 0
                                          • robin4002
                                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

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

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 4
                                            • 5
                                            • 10
                                            • 11
                                            • 1 / 11
                                            • First post
                                              Last post
                                            Design by Woryk
                                            Contact / Mentions Légales

                                            MINECRAFT FORGE FRANCE © 2018

                                            Powered by NodeBB