• Administrateurs Rédacteurs Moddeurs confirmés

    Nous allons maintenant commencer notre premier bloc.

    Pre-requis

    Dans la classe principale

    À la suite de la déclaration de votre instance, déclarez votre bloc comme ceci :

        public static Block BlockTutorial;
    

    Pensez à importer “net.minecraft.block.Block”
    Si vous voulez créer plusieurs blocs, vous pouvez les déclarer à la suite de cette façon :

        public static Block BlockTutorial, DeuximeBlock, TroixiemeBlock;
    

    Ensuite dans la partie @PreInit, vous allez ajouter ceci :

        BlockTutorial = new BlockTutorial(2000).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("BlockTutorial").setTextureName("modtutoriel:BlockTutorial");
    

    2000 est l’id du bloc (les ids de bloc vont de 0 à 4095, les ids de 0 à 600 sont à éviter pour ne pas avoir de conflit avec les id de minecraft), setHardness correspond à la résistance du bloc par rapport à la pioche (ou à la main) et setResistance est la résistance aux explosions, setStepSound défini le son du bloc et setTextureName défini la texture (nous reviendrons dessus plus tard)
    Pour la liste les sons possible :

    • soundPowderFootstep = son par défaut, le même que soundStoneFootstep
    • soundWoodFootstep = son du bois
    • soundGravelFootstep = son du gravier
    • soundGrassFootstep = son de l’herbe, des pousses, des feuilles …
    • soundStoneFootstep = son de la pierre
    • soundMetalFootstep = son des blocs de fer, or, diamant (c’est le même que la pierre)
    • soundGlassFootstep = son du verre
    • soundClothFootstep = son de laine
    • soundSandFootstep = son du sable
    • soundSnowFootstep = son de la neige
    • soundLadderFootstep = son de l’échelle
    • soundAnvilFootstep = son de l’enclume

    Juste en dessous, ajoutez :

    GameRegistry.registerBlock(BlockTutoriel, "BlockTutoriel");
    

    Il vous restera une erreur sur “new BlockTutoriel”, créez cette classe.

    La classe du bloc

    Vous allez avoir une classe qui ressemble à ça :

    package tutoriel.common;
    
    public class BlockTutoriel
    {
    
    }
    

    Ajoutez extends Block après “public class BlockTutoriel”. Importez “net.minecraft.block.Block”. Maintenant vous allez avoir une erreur sur “BlockTutoriel”, passez la souris dessus et faite "add constructor ‘BlockTutoriel(int, Material)’
    Vous allez obtenir un contructeur comme ceci :

        public BlockTutoriel(int par1, Material par2Material)
        {
            super(par1, par2Material);
        }
    

    Nous allons le modifier de cette façon la :

        public BlockTutoriel(int id)
        {
            super(id, Material.rock);
            this.setCreativeTab(CreativeTabs.tabBlock);
        }
    

    Material.rock est le matériel, avec le type rock le bloc ne peut que être dropé avec une pioche. Pour la liste des matériels, fait ctrl + clic sur Material, la classe Material va s’ouvrir, il y tout dedans.
    Pensez à changer les paramètres du type par1, par2, par3, etc. par ce qui correspond, on s’y retrouve beaucoup mieux avec des noms corrects.

    Les ressources du bloc (texture + nom)

    Dans la classe principale, j’ai utilisé cette fonction : .setTextureName(“modtutoriel:BlockTutorial”)
    modtutoriel correspond à mon modid sans aucune majuscule, il ne faut pas en mettre. BlockTutorial est le nom de ma texture

    Pour l’emplacement de la texture, allez dans votre dossier forge/mcp/src/minecraft
    Dans ce dossier se trouvent les sources du jeu. Vous devrez normalement y voir un dossier du même nom que votre package, tutoriel dans mon cas. Créez un nouveau dossier et nommez-le “assets” (Pour ceux qui ont une version récente de forge, ce dossier existe déjà). À l’intérieur de ce dossier, créez un autre dossier et nommez-le avec votre modid sans majuscule, modtutoriel dans mon cas. À nouveau, dans ce dossier créez un autre dossier nommé textures. Dans le dossier texture, créez le dossier blocks
    Nous avons donc 4 dossiers : assets/modtutoriel/textures/blocks/
    Maintenant dans le dossier blocks, créez votre fichier .png de 16x16 nommé BlockTutoriel, ce qui correspond à la partie après le “:”. (vous pouvez aussi faire des textures plus grandes, mais elles seront plus lourdes à charger)
    Par ailleurs, lorsque vous compilerez votre mods, pensez à placer le dossier mods qui se trouve dans /forge/mcp/src/minecraft dans l’archive de votre mods, sinon les textures seront manquantes.

    Retournez dans le dossier qui porte comme nom votre modid, “modtutoriel” dans mon cas. Créez un nouveau dossier nommé “lang”
    Dans ce dossier, créer un nouveau fichier en_US avec l’extension .lang. Pour ça, ouvrez votre éditeur de texte (notepad ++ comme je vous l’ai conseillé si possible), faite un nouveau fichier, cliquez sur enregistrer sous et cochez “All type (.)”
    Dans ce fichier, ajoutez tile.«le nom non localisé de votre bloc (celui dans setUnlocalizedName(""))».name=«le nom en jeu»
    Par exemple :

    tile.BlockTutorial.name=Block Tutorial
    

    /!\ Il ne doit pas avoir d’espace entre le nom non localisé, l’égale, et le nom localisé /!\
    Vous pouvez aussi créer les autres fichiers de langage, fr_FR, etc …
    /!\ Vérifiez que le fichier est encodé en UTF-8 sans BOM, avec notepad ++, cliquez sur Encodage puis “encoder en UTF-8 (sans BOM)”, sinon vous aurez des problèmes avec les accents /!

    Rendu final

    Voir les changements sur Github

    Un bloc moddé sous Minecraft


  • le “GameRegistry.registerBlock()” doit etre dans le “PreInit()” maintenant ? 😕

  • Administrateurs

    Pas forcément, moi je le mets dans le post init, et cela marche très bien.


  • Ah! … En effet , j’ai fait une petite expérience en changeant les lignes de codes de fonctions et je dirais que peut importe dans quelles fonction elles sont , du moment qu’elle sont dans le bon ordre ca fonctionne.


  • A mon avis il manquent quelques fonctions importantes à expliquer et qui ne sont pourtant nul part dans les tuto du forum:
    LanguageRegistry.addName(Object toName, String readableName); pour ajouter un nom “lisable” et
    MinecraftForge.setBlockHarvestLevel(Block block, String toolClass, int tier);

  • Moddeurs confirmés

    LanguageRegistry.addName(Object toName, String readableName);
    Plus besoin en 1.6.2, ils faut juste crée un fichier .lang dans assets/modid/lang/, par defaut: en_US.lang et après dedans:
    tile.nom non localisé.name=nom localisé

    MinecraftForge.setBlockHarvestLevel(Block block, String toolClass, int tier);
    Oui, il faudrait l’ajouter.

  • Administrateurs Rédacteurs Moddeurs confirmés

    LanguageRegistry sera retiré en 1.7, obsolète, à ne plus utiliser, les fichiers de lang externe sont bien plus intéressant. (cf : Deprecate LanguageRegistry)

    Pour le setToolClass, surement dans un autre tutoriel pour customiser son bloc.


  • LanguageRegistry sera retiré en 1.7, obsolète, à ne plus utiliser, les fichiers de lang externe sont bien plus intéressant. (cf : Deprecate LanguageRegistry)

    A d’accord vu que je me demandais lequel des deux il fallait mieux utiliser vu que sur le wiki anglais de forge le code n’a sans doute pas été mis à jours

  • Administrateurs Rédacteurs Moddeurs confirmés

    @‘robin4002’:

    En conséquence, utilisez une version des sources de forge supérieur à 9.10.1.849 pour suivre les tutoriels.

    Je pense que vais l’ajouter au tutoriel de l’installation de forge.


  • J’aurais une question je voudrais creer mon bloc de dirt personalisé mais je veux qu’il ait les meme propriétés a savoir etre labourré pouvoir y planter des saplings etc
    merci 🙂

  • Administrateurs Rédacteurs Moddeurs confirmés

    Regarde canSustainPlant dans Block.java.
    Et pour être labouré, EventHoe.
    http://www.minecraftforgefrance.fr/showthread.php?tid=181&pid=1855#pid1855


  • j’ai beau essayer mon bloc n’accueille pas les saplings
    je comprends pas pourquoi

    j’ai une erreur a :
    .canThisPlantGrowOnThisBlockID

    je suis pas sur mais sans sa on peut pas poser de saplings si je comprends bien
    il me dit que la methode n’est pas visible

  • Administrateurs Rédacteurs Moddeurs confirmés

    Oups, il y a 500 fois plus simple.
    Dans le constructeur de ton bloc :
    Material.ground
    Et voila.


  • perso sa ne change rien

  • Modérateurs

    Essaye de faire un extends BlockDirt


  • sa me met une erreur a :
    super(id, Material.ground);
    ( meme si je change ground en autre chose )

    Edit : j’ai enlever la ligne super(id, Material.ground);
    sa marche mais le blocs reste un bloc basique

  • Modérateurs

    laisse super(id) et ensuite pour que ton bloc soit labouré, il faut créer un nouveau bloc qui est les mêmes caractéristiques que la terre labourée.


  • Pour le bloc labouré je sais comment faire moi je veux juste qu’on puisse y planter des saplings pour le moment
    et sa change toujours rien.


  • Salut,
    j’ai essayé d’utiliser une fonction pour définir la texture du bloc avec OnBlockAdded, mais mon block n’a toujours pas de texture …
    Une idée ?

  • Administrateurs Rédacteurs Moddeurs confirmés

    La fonction pour la texture se met dans le constructeur, pas dans onBlockAdded.