1.15.2 forge block [1.15.x] Créer un bloc simple



  • Bonjour bonsoir. Suite à la sortie de la version 1.15.2 de Forge, j'ai décidé de transmettre mes connaissances sur cette api au débutant en modding en commençant par les blocs

    Sommaire du tutoriel

    Pré-requis

    Créer le Deferred Register

    Si en 1.12.2 vous aviez l'habitude d'utiliser les events pour enregistrer vos blocs et bien dans ce tutoriel nous n'allons pas les utiliser mais nous allons voir une nouvelle technique qui communiqueras directement avec les registres de forge, ce sont les DeferredRegister qui permettent d'enregistrer tout un tas de choses avec seulement quelque lignes.

    Pour commencer, nous allons avoir besoin de créer une nouvelle classe pour enregistrer notre blocs et l'item du bloc qui dans ce cas sera appelée ModBlocks (mais vous pouvez l'appeler autrement cela n'a pas d'importance)

    public class ModBlocks{
    
    }
    

    Maintenant attaquons nous au DeferredRegister avec cette ligne

    public class ModBlocks
    {
      public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, "modid");
      public static final DeferredRegister<Item> ITEM_BLOCKS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid");
    }
    

    Pour que ce soit plus clair, ici nous avons deux variable DeferredRegister où l'on a attaché la classe Block et la classe Item(faite attention de bien importer la classe Block du package net.minecraft.block et la classe Item du package net.minecraft.item sinon vous aurez une erreur), pour des raisons de praticité on a instancié les deux variables directement dans la classe (avec en paramètre le ForgeRegistries.BLOCKS et ForgeRegistries.ITEMS qui indique le registre dans lequel seront enregistré nos blocs/items et le modid qui est celui de votre mod (donc veillez bien a le changer et si vous le voulez vous pouvez le stocker dans une variable en static final pour que si un jour vous veniez a changer le modid de votre mod que ça soit répliqué dans tout vos classes utilisant cette variable))

    Maintenant il faut que nous enregistrions nos DeferredRegister pour qu'ils soit détecter par Forge. Pour cela il faudra le faire dans le constructeur de votre classe principale

    @Mod("modid")
    public class ClassePrincipale
    {
    
     public ClassePrincipale()
     {
       // Vos lignes seront ici
     }
    
    }
    

    (Bien entendu le nom de la classe n'influe pas, c'est a vous de le choisir)

    Dans ce constructeur nous aurons besoin de l'event bus de Forge pour enregistrer notre DeferredRegister et qu'il soit détecter au lancement du jeu.

    @Mod("modid")
    public class ClassePrincipale
    {
    
     public ClassePrincipale()
     {
        IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
        ModBlocks.BLOCKS.register(bus);
        ModBlocks.ITEM_BLOCKS.register(bus);
     }
    
    }
    

    Normalement si vous avez suivi ce tutoriel correctement, votre DeferredRegister devrait fonctionner. Pour le vérifier nous allons créer un bloc

    Créer le bloc sans classe custom

    Pour les blocs il y a "2 manières" d'en créer, sans classe custom et avec une classe custom, ici nous allons regarder comment créer un bloc sans classe custom.

    Pour cela rendez vous dans la classe que nous avons crée pour nos blocs (dans ce tuto je le rappelle c'est ModBlocks mais vous pouvez changer le nom)

    public class ModBlocks
    {
        public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, "modid");
        public static final DeferredRegister<Item> ITEM_BLOCKS = new DeferredRegister<>(ForgeRegistries.ITEMS, "modid");
    
        public static final RegistryObject<Block> MON_BLOC = BLOCKS.register("mon_bloc", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.STONE)));
        public static final RegistryObject<Item> MON_ITEM_BLOC = ITEM_BLOCKS.register("mon_bloc", () -> new BlockItem(MON_BLOC.get(), (new Item.Properties())));
    }
    

    Et voila, par rapport a la 1.12.2 où il fallait créer une variable de type Block on en créé une de type RegistryObject<Block> ce qui est plus compacte car cela tient en une seul ligne. Mais le type de variable RegistryObjectn'est pas exactement un bloc dans notre cas mais une variable objet contenant le bloc, ce qui veut dire que pour y acceder ce sera MON_BLOC .get() (tout ceci est valable aussi pour les items de bloc).

    Pour que ce soit plus clair, le premier paramètre permet de déterminer l'identifiant de votre block et donc sa clé de traduction ensuite que vous pourrez utiliser pour traduire le nom de votre bloc avec les fichiers lang (qui sont depuis la 1.13 en JSON).

    Le deuxième paramètre lui est un Supplier, c'est un type qui requiert une utilisation des lambda (pour savoir ce que sont les lambda je vous invite a vous renseigner sur Google) après cela on instancie la classe Block de Minecraft avec en premier paramètre Block.Properties.create(Material.MATERIAU, MaterialColor.COULEUR). Le matériau détérmine certaine propriété comme l'outil nécessairre pour le casser, si il est détruit quand un piston le pousse etc... La couleur du matériau quand a elle définit la couleur que le bloc aura sur une map.

    Pour la ligne concernant l'item je ne reviendrais pas dessus vu que le tutoriel de ZomZD l'éxpliquera mieux que moi, la seul chose a savoir est que le premier argument de la classe BlockItem sera votre bloc qu'il faudrat récuperer comme ceci par exemple MON_BLOC .get() .

    Créer le bloc avec classe custom

    Bon maintenant que nous avons vu comment créer un bloc en prenant la classe générique Block de Minecraft il est temps de voir comment faire avec une classe personnalisée.

    Ici il y a 2 façons de le faire, en mettant un argument Block.Properties dans le constructeur de votre classe et donc de mettre l'argument dans l'appelle du constructeur de la classe parent, ici Block et donc d'instancier Block.Properties dans la classe où nous avons les DeferredRegister ou bien d'instancier directement le Block.Properties dans le constructeur de la classe parent

    public class MonBloc extends Block {
    
        public MonBloc(Block.Properties properties) {
            super(properties);
        }
    }
    
    public class MonBloc extends Block {
    
        public MonBloc() {
            super(Block.Properties.create(Material.ROCK, MaterialColor.STONE).lightValue(10));
        }
    }
    

    Dans le premiers cas nous aurons donc a instancier le Block.Properties dans notre classe ModBlocks :

        public static final RegistryObject<Block> MON_BLOC = BLOCKS.register("mon_bloc", () -> new MonBloc(Block.Properties.create(Material.ROCK, MaterialColor.STONE).lightValue(10)));
    

    Et dans le second cas nous pourrons faire comme ceci :

        public static final RegistryObject<Block> MON_BLOC = BLOCKS.register("mon_bloc", MonBloc::new);
    

    Pour le deuxième cas vous pouvez vous demander qu'est ce que c'est ça MonBloc::new ?
    Et bien c'est ce qu'on pourrait appeler une contraction de () -> new MonBloc().

    Pour que ce soit clair, la classe hérite de la classe Block de Minecraft pour que ce soit compatible avec notre DeferredRegister. Après l'instance de Block.Properties j'ai mis une propriété, je ferais surement un tutoriel plus tard sur chacune des propriété de bloc

    .lightValue(valeur) : Permet que le bloc émette de la lumière de x bloc selon la valeur.

    Voila, votre bloc est prêt, si vous lancez le jeu il manquera le modèle et les textures mais vous pourrez le retrouver dans une Creative Tab si vous l'avez défini. Nous pouvons maintenant nous attaquer au modèle, texture et au drop du bloc.

    Les ressources

    Maintenant attaquons nous au ressources, l'ensemble des ressources de votre mod vont aller dans le dossier src/main/resources puis dans le dossier assets/modid/ (vous devrez remplacer le modid par celui de votre mod, je ne le répeterais plus). Si ces dossiers n'éxistent pas, il faudrat les créer par vous même.

    Les états de blocs

    Nous allons tout d'abord créer un dossier blockstates (toujours dans votre dossier assets/modid). Nous allons y mettre un fichier dont le nom doit être le même que l'identifiant de votre bloc, suivit de l'extension .json. Dans notre cas ce sera mon_bloc.json

    Dans ce fichier, nous allons renseigner le modèle pour chaque variante de notre bloc :

    {
      "variants": {
        "": { "model": "modid:block/mon_bloc" }
      }
    }
    
    

    Comme il s'agit d'un bloc simple, il n'y a aucune variante hormis celle par défaut (représenté par la chaine de caractère vide). On y indique donc le modèle de cette variante qui se trouve donc dans le dossier models/block qui se trouve dans le dossier assets/modid et se nomme donc mon_bloc.

    Les modèles de blocs

    Pour continuer nous allons donc créer les dossiers suivants : models/block (toujours dans votre dossier assets/modid), et nous allons créer un fichier avec un nom identique a celui que nous avons mis dans le fichier mon_bloc.json se trouvant dans le dossier blockstates.

    {
        "parent": "block/cube_all",
        "textures": {
            "all": "modid:block/mon_bloc"
        }
    }
    
    
    • le paramètre parent correspond à un modèle de bloc prédéfini de base par Minecraft, vous pouvez mettre une autre valeur en fonction du bloc ou même créer votre propre parents.

    Ce tableau répertorie les parents principaux

    Nom Description
    block/cube_all Bloc de taille normal avec la même texture sur toute les faces
    block/cube_column Bloc de taille normal avec 2 textures, end pour le haut et le bas, side pour les cotés
    block/cube Bloc de taille normal avec 6 textures, une pour chaque facedown, up, north, east, south,west et particle pour la texture des particules
    • le paramètre texture est étroitement lié au parent. Si nous prenons le cas de notre bloc,pour cube_all, il n'existe qu'un paramètre, all qui est le chemin de la texture pour toutes les faces du bloc.

    Les modèles d'item blocs

    Nous pouvons donc attaquer les modèles d'item de bloc qui vont être assez rapide a survoler.

    Tout d'abord si le dossier models/item n'existe pas, veillez a les créer dans le dossier assets/modid, puis nous allons créer un fichier avec un nom correspondant a l'identifiant que nous avons mis pour l'item du bloc (dans notre cas ça sera toujours mon_bloc) avec une extension en .json.

    {
        "parent": "modid:block/mon_bloc"
    }
    

    Les fichiers de langues

    Toujours pareil, si le dossier lang n'éxiste pas, créez le dans le dossier assets/modid. Dans ce dossier vous pourrez créer des fichier avec comme extension .json pour chacune des langues à supporter pour votre mod sous cette forme langue_variante.json. Si vous voulez un tableau des langues supportées par Minecraft voici un lien.

    Nous mettrons pour notre part un fichier fr_fr.json pour la langue French.

    {
      "block.modid.mon_bloc": "Nom traduit selon la langue du fichier"
    }
    

    Les textures

    Nous arrivons donc a la fin pour les ressources, nous allons créer le dossier textures/block et nous allons ajouter le fichier de texture pour notre bloc. Veillez a que la taille de l'image soit un multiple de 2, que le nom du fichier soit compris dans ceux que vous aurez mis dans le fichier modèle de votre bloc (dans le dossier models/block) et que l'extension du fichier soit en .png

    Les datas

    Depuis la 1.14, les drops des blocks sont stockés dans un dossier blocks qui se trouve dans les dossiers data/modid/loot_tables (bien entendu vous devez remplacer modid par celui de votre mod).

    Puis nous allons créer un fichier avec un nom identique a l'identifiant de votre bloc avec une extension en .json(ici ça sera mon_bloc.json)

    {
      "type": "minecraft:block",
      "pools": [
        {
          "rolls": 1,
          "entries": [
            {
              "type": "minecraft:item",
              "name": "modid:mon_bloc"
            }
          ],
          "conditions": [
            {
              "condition": "minecraft:survives_explosion"
            }
          ]
        }
      ]
    }
    
    • Dans entries le paramètre name devra être l'id du bloc/item qui sera droppé.

    Résultat

    Si vous n'avez pas définit de Creative Tab pour l'item du bloc, vous pouvez obtenir votre bloc avec la commande /give Dev modid:id_du_bloc (en remplaçant le modid par l'identifiant de votre mod et id_du_bloc par l'identifiant de votre bloc)

    2020-05-25_15.13.08.png 2020-05-25_15.12.58.png

    Licence et attribution

    Creative Commons

    Ce tutoriel rédigé par Mysterious_Dev corrigé par (personne pour l'instant) et publié sur 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