Créer un bloc basique


  • Administrateurs

    youtubeCe tutoriel est également disponible en vidéo.

    Sommaire

    Introduction

    Dans ce tutoriel, nous allons créer notre premier bloc. Un bloc est comme un item mais qui peut aussi être placé dans le monde. En fait, un bloc possède un item, il s'agit d'un ItemBlock. Son existence n'est pas à négliger, elle nous sera utile plus tard pour personnaliser notre bloc et pour les metadatas.

    Pré-requis

    Code

    La classe principale :

    Pour commencer, en dessous de vos items ou de votre proxy, déclarez le bloc :

        public static Block blockTutoriel;
    

    Pensez à importer net.minecraft.block.Block (ctrl + shift + o).
    Ensuite, il faut initialiser le bloc. Dans la fonction preInit ajoutez :

            blockTutoriel = new BlockTutoriel(Material.rock).setBlockName("tutoriel").setBlockTextureName("modtutoriel:block_tutoriel");
    

    BlockTutoriel correspond au nom de la classe de mon bloc, dans le constructeur, j'ai mis un matériel. Il existe de nombreux matériaux, faîtes simplement un ctrl + clic sur Material, la classe Material.java va s'ouvrir, les matériaux ayant :

    • setBurning : peuvent brûler.
    • setRequiresTool : ne peuvent que droper avec un outil spécifique (pioche pour la plupart, pelle pour la neige).
    • setTranslucent : sont en général des matériaux transparent.
    • setNoPushMobility : ne peuvent pas être déplacé par un piston.
    • setBlockName définit le nom non localisé. Celui-ci sera complété par le préfixe "tile." et le suffixe ".name". Il sera utiliser dans le fichier de lang.
    • setBlockTextureName définit le nom de la texture. Vous pouvez remplacer "modtutoriel:block_tutoriel" par MODID + ":block_tutoriel" si vous avez fait une constante MODID comme dans le tutoriel sur un item basique. modtutoriel correspond à mon modid et block_tutoriel au nom de la texture.

    Il ne reste plus qu'à enregistrer le bloc. Toujours dans la fonction preInit ajoutez :

            GameRegistry.registerBlock(blockTutoriel, "block_tutoriel");
    

    blockTutoriel étant le nom de la variable du bloc et block_tutoriel le nom dans le game data (utilisé pour le /give, et les donnés de la map). De préférence, ne mettez pas d'espace (utilisez des tirets du bas), pas de caractères spéciaux (accent, etc...) et pas de majuscule.

    La classe du bloc :

    Depuis tout à l'heure, vous avez une erreur sur BlockTutoriel, créez cette classe, et en "super class" mettez net.minecraft.block.Block (ou ajoutez le extends Block une fois la classe créée).
    Le nom de votre classe sera souligné en rouge, il suffit juste de passer la souris dessus et de faire "add constructor 'NomDeVotreClasse(Material)'". Vous devrez avoir quelques chose comme ceci maintenant :

    package fr.minecraftforgefrance.tutoriel.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    
    public class BlockTutoriel extends Block
    {
        protected BlockTutoriel(Material p_i45394_1_)
        {
            super(p_i45394_1_);
        }
    }
    

    p_i45394_1_ n'étant pas trop significatif, nous allons changer le nom de ce paramètre pour avoir quelque chose qui a un sens :

    package fr.minecraftforgefrance.tutoriel.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    
    public class BlockTutoriel extends Block
    {
        protected BlockTutoriel(Material material)
        {
            super(material);
        }
    }
    

    Et voila !

    La texture et le nom :

    Il faut maintenant s'occuper des ressources. Allez dans le dossier forge/src/main/resources/assets/modid/
    Commençons d'abord par le dossier lang, ouvrez le fichier en_US.lang et ajoutez :

    tile.le nom non localisé de votre bloc.name=Le nom en jeu en anglais
    

    Dans mon cas :

    tile.tutoriel.name=Bloc Tutoriel
    

    Même chose avec les autres langages.
    Ensuite retournez dans le dossier de votre mod, et ouvrez le dossier "textures". Créez un nouveau dossier nommé "blocks". Dans ce dossier, ajoutez votre texture (format .png, 16x16 ou 32x32 ou 64x64, etc ...) portant le nom que nous avons mit dans le .setBlockTextureName du bloc.

    Ajouter le bloc dans un onglet créatif :

    Dans l'initialisation de votre bloc, il suffit d'ajouter :

    .setCreativeTab(CreativeTabs.tabBlock)
    

    Ce qui donne donc :

            blockTutoriel = new BlockTutoriel(Material.rock).setBlockName("tutoriel").setBlockTextureName("modtutoriel:block_tutoriel").setCreativeTab(CreativeTabs.tabBlock);
    

    Vous pouvez aussi définir la table créatif dans le constructeur du bloc :

        protected BlockTutoriel(Material material)
        {
            super(material);
                    this.setCreativeTab(CreativeTabs.tabBlock);
        }
    

    Résultat

    Voir le commit sur github
    Le commit sur github montre clairement où ont été placés les fichiers, ainsi que ce qui a été ajouté et retiré dans le fichier.

    Crédits

    Rédaction :

    Correction :

    Creative Commons
    Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    retourRetour vers le sommaire des tutoriels



  • Merci 🙂



  • Bonjour !
    tout d'abord, merci pour vos tutoriels très bien faits ! Je voulais juste suggérer de rajouter ce tuto dans le sommaire des tutos pour minecraftforge 1.7.2 !
    Bonne continuation !


  • Administrateurs

    On appelle ça un oublie, normalement il aurait du y être depuis mercredi ^^
    Merci de l'avoir faire remarqué, je l'ai ajouté 😉



  • Il n'y a plus setHardness?
    Tu as oublié de préciser que setHarvestLevel à changer: http://www.minecraftforge.net/wiki/Basic_Blocks#For_1.7

    Un lien utile à rajouter:
    http://minecraft.gamepedia.com/Digging#Blocks_by_hardness


  • Administrateurs

    Ha oui, j'ai oublié d'en parler, je le mettrai dans le tutoriel sur la customisation de bloc 😉



  • Bonjour/soir !
    C'est encore moi et j'ai un nouveau problème :s

    Après avoir fait la base de mon mod, j'ai créer un nouveau bloc, sauf que quand j'essaye de lancer le Client de mod, le Client crash sans ouverture de fenêtre avec l'erreur :

    [22:59:50] [main/INFO] [LaunchWrapper]: Loading tweak class name cpw.mods.fml.common.launcher.FMLTweaker
    [22:59:50] [main/INFO] [LaunchWrapper]: Using primary tweak class name cpw.mods.fml.common.launcher.FMLTweaker
    [22:59:50] [main/INFO] [LaunchWrapper]: Calling tweak class cpw.mods.fml.common.launcher.FMLTweaker
    [22:59:50] [main/INFO] [FML]: Forge Mod Loader version 7.2.156.1060 for Minecraft 1.7.2 loading
    [22:59:50] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.6.0_65, running on Mac OS X:x86_64:10.8.5, installed at /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    [22:59:50] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
    [22:59:50] [main/INFO] [LaunchWrapper]: Loading tweak class name cpw.mods.fml.common.launcher.FMLInjectionAndSortingTweaker
    [22:59:50] [main/INFO] [LaunchWrapper]: Loading tweak class name cpw.mods.fml.common.launcher.FMLDeobfTweaker
    [22:59:50] [main/INFO] [LaunchWrapper]: Calling tweak class cpw.mods.fml.common.launcher.FMLInjectionAndSortingTweaker
    [22:59:50] [main/INFO] [LaunchWrapper]: Calling tweak class cpw.mods.fml.common.launcher.FMLInjectionAndSortingTweaker
    [22:59:50] [main/INFO] [LaunchWrapper]: Calling tweak class cpw.mods.fml.relauncher.CoreModManager$FMLPluginWrapper
    [22:59:50] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work!
    [22:59:51] [main/ERROR] [FML]: The minecraft jar file:/Users/Thomas/.gradle/caches/minecraft/net/minecraftforge/forge/1.7.2-10.12.1.1060/forgeSrc-1.7.2-10.12.1.1060.jar!/net/minecraft/client/ClientBrandRetriever.class appears to be corrupt! There has been CRITICAL TAMPERING WITH MINECRAFT, it is highly unlikely minecraft will work! STOP NOW, get a clean copy and try again!
    [22:59:51] [main/ERROR] [FML]: FML has been ordered to ignore the invalid or missing minecraft certificate. This is very likely to cause a problem!
    [22:59:51] [main/ERROR] [FML]: Technical information: ClientBrandRetriever was at jar:file:/Users/Thomas/.gradle/caches/minecraft/net/minecraftforge/forge/1.7.2-10.12.1.1060/forgeSrc-1.7.2-10.12.1.1060.jar!/net/minecraft/client/ClientBrandRetriever.class, there were 0 certificates for it
    [22:59:51] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
    [22:59:51] [main/INFO] [LaunchWrapper]: Calling tweak class cpw.mods.fml.relauncher.CoreModManager$FMLPluginWrapper
    [22:59:51] [main/INFO] [LaunchWrapper]: Calling tweak class cpw.mods.fml.common.launcher.FMLDeobfTweaker
    [22:59:52] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main}
    [22:59:52] [main/ERROR] [LaunchWrapper]: Unable to launch
    java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.6.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[?:1.6.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[?:1.6.0_65]
    at java.lang.reflect.Method.invoke(Method.java:597) ~[?:1.6.0_65]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) [launchwrapper-1.9.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.9.jar:?]
    Caused by: joptsimple.MissingRequiredOptionException: Missing required option(s) ['accessToken']
    at joptsimple.OptionParser.ensureRequiredOptions(OptionParser.java:447) ~[OptionParser.class:?]
    at joptsimple.OptionParser.parse(OptionParser.java:437) ~[OptionParser.class:?]
    at net.minecraft.client.main.Main.main(Main.java:47) ~[Main.class:?]
    … 6 more
    
    

  • Administrateurs

    Rien à voir avec le bloc.
    Tu as suivis le deuxième bonus ici : http://www.minecraftforgefrance.fr/showthread.php?tid=566#bonus ?
    Si oui, tu t'es planté dans ton mdp ou dans ton pseudo / adresse mail.
    Si non, il y a un truc qui a fail, ajoute "–accessTocken FML" dans les arguments de lancement.



  • @'robin4002':

    Rien à voir avec le bloc.
    Tu as suivis le deuxième bonus ici : http://www.minecraftforgefrance.fr/showthread.php?tid=566#bonus ?
    Si oui, tu t'es planté dans ton mdp ou dans ton pseudo / adresse mail.
    Si non, il y a un truc qui a fail, ajoute "–accessTocken FML" dans les arguments de lancement.

    Ah Oui, merci 😉



  • C'est étrange, je ne pense pas avoir fais d'erreur, mais Eclipse me met constamment une erreur à la partie d'initialisation du bloc, sur la partie new StrangeStone(Material.rock)…

    Pourtant, je pense ne pas avoir fait d'erreur.

    
    @EventHandler
    
    public void preInit(FMLPreInitializationEvent event)
    {
    //preinit blocks
    strangeStone = new StrangeStone(Material.rock).setBlockName("StrangeStone").setHardness(1.5F).setBlockTextureName(MODID + ":StrangeBlock").setCreativeTab(CreativeTabs.tabBlock);
    
    //registery blocks
    GameRegistry.registerBlock(strangeStone, "StrangeStone");
    }
    

    Si quelqu’un a une explication, qu'il me la dise s'il vous plait !


  • Administrateurs

    Eclipse indique quoi ?
    Tu as quoi dans ta classe StrangeStone ?



  • Il me propose de changer la visibilité de StrangeStone sur public…
    Dans la classe du block j'ai  ceci:

    
    package com.sugarshy.harmomod.blocks;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    
    public class StrangeStone extends Block
    {
    protected StrangeStone(Material material)
    {
    super(material);
    }
    }
    


  • Il faut y changer en public sinon la classe est pas accessible.



  • @'Diangle':

    Il faut y changer en public sinon la classe est pas accessible.

    Pourtant elle n'y est pas sur le github du résultat final…



  • @'Diangle':

    Il faut y changer en public sinon la classe est pas accessible.

    Et bien tu avais raison, merci !


  • Administrateurs

    Car ta classe StrangeStone n'est pas dans le même package que ta classe main. Si tu utilises des packages différent, il faut toujours mettre en public !



  • Ah, je comprend mieux !
    Merci !



  • En faite tu as :
    protected, qui peux que être utiliser dans une classe qui hérite
    private, qui est dans la classe et pas accessible depuis un autre package
    public, c'est les portes ouverte.



  • Il faut vraiment que je me mette sérieusement au Java…. en tout cas merci, je le saurai pour la prochaine fois !



  • Bonjour,
    j'ai encore un problème, c'est que le bloc n’apparaît pas en jeu.

    #ma classe principale:(ma classe principale:)

    #la classe de un de mes blocs que je veut ajouter:(la classe de un de mes blocs que je veut ajouter:)

    #la console:(la console:)