27 févr. 2015, 05:46

youtubeCe tutoriel est également disponible en vidéo.

Sommaire

Introduction

Dans ce tutoriel, nous allons créer un bloc. Un bloc est comme un item qui peut être placé dans le monde. Le bloc possède un item (ItemBlock). Ce tutoriel vous sera important pour la réalisation de vos futurs blocs plus (ou moins) complexes.

Pré-requis

Code

La classe principale :

Tous d’abord, déclarez votre bloc en dessous des proxys, dans le init.

    public static Block tutoBlock;

N’oubliez pas d’importer la classe Block (net.minecraft.block.Block) avec Ctrl+Shift+O (ou en passant la souris sur l’erreur).
Une fois ceci effectué, il nous faut initialiser notre bloc.

tutoBlock = new TutoBlock(Material.rock)

Dans le constructeur du bloc nous avons en paramètre le matériau. Il existe différents matériaux, pour les voir faite Ctrl+clic droit, il existe divers matériaux. Les matériaux peuvent avoir différentes propriétés ; en voici la liste :

  • setBurning() = peut brûler
  • setRequiresTool() = droppe uniquement avec l’outil requis
  • setImmovableMobility() = n’est pas déplaçable par un piston
  • setNoPushMobility() = contrairement à setImmovableMobility(), si un piston se déplace sur le bloc, il disparaît
  • setTranslucent() = rend le bloc transparent

Vous pouvez aussi ajouter a votre bloc :

  • setUnlocalizedName() = il s’agit du nom de votre bloc
  • setResistance() = cela correspond à la résistance aux explosions de votre bloc
  • setHardness() = c’est la vitesse de minage du bloc
  • setCreativeTab() = vous permet de définir dans quel onglet du menu créatif se trouve votre bloc (cela fonctionne avec vos Creative Tabs)

voici ce que vous devriez avoir si vous les ajoutez :

        tutoBlock = new TutoBlock(Material.rock).setUnlocalizedName("tuto_block").setResistance(5.0F).setHardness(3.0F).setCreativeTab(CreativeTabs.tabFood);

Donc, j’ai donné un nom à mon bloc “tuto_block”, je lui ai attribué une résistance aux explosions et une vitesse de minage qui est la même que le minerai de charbon, je l’ai aussi mis dans l’onglet créatif de la nourriture (vous pouvez le mettre dans un autre, pour voir la liste faites : Ctrl+clique droit sur la classe).
Ensuite, il faut mettre :

        GameRegistry.registerBlock(tutoBlock, "tuto_block");

Le premier paramètre permet d’enregistrer votre bloc (tutoBlock est le nom de votre variable) et le second permet de vous le donner par la commande “/give modid:tuto_block”. Dans le second paramètre évitez les espaces (utiliser les “_” à la place), les majuscules et les caractères spéciaux.

La classe du bloc :

Normalement, vous avez une erreur depuis que vous avez initialisé votre bloc sur TutoBlock car cette classe n’existe pas. Nous allons la créer. Créez la classe et ajoutez en super classe la classe “net.minecraft.block.Block”, vous pouvez aussi ajouter “extends Block” une fois la classe créée.
Une fois ceci fait, vous devriez avoir une erreur sur le nom de votre classe, passez la souris dessus et cliquez sur “Add constructor NomDeLaClasse(Material)”, une fois cette action effectuée vous devriez avoir cela :

    protected TutoBlock(Material materialIn)
    {
        super(materialIn);
    }

Vous pouvez renommer le paramètre “materialIn” en “material”, ce qui donne :

    protected TutoBlock(Material material)
    {
        super(material);
    }

Nous en avons fini avec notre bloc. Cependant si vous lancez votre jeu, vous aurez des erreurs dans la console, mais en jeu votre bloc aura une texture bizarre (avec deux carrés violet et deux carré noir sur chaque face). Donc nous allons ajouter ce qu’il faut pour afficher la texture.

Les proxy

Nous allons créer des fonctions qui nous permettrons d’enregistrer les .json et donc la texture, notez que ces fonctions sont utilisables pour vos autres blocs (et items). Commencez par ajouter dans le Common Proxy :

    protected void registerItemTexture(Item item, int metadata, String name){}

    protected void registerItemTexture(Item item, String name){}

    protected void registerBlockTexture(Block block, int metadata, String name){}

    protected void registerBlockTexture(Block block, String name){}

Et ensuite, dans le client proxy :

    @Override
    public void registerItemTexture(Item item, int metadata, String name)
    {
        ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher();
        mesher.register(item, metadata, new ModelResourceLocation("tuto:" + name, "inventory"));
    }

    @Override
    public void registerItemTexture(Item item, String name)
    {
        registerItemTexture(item, 0, name);
    }

    @Override
    public void registerBlockTexture(Block block, int metadata, String name)
    {
        registerItemTexture(Item.getItemFromBlock(block), metadata, name);
    }

    @Override
    public void registerBlockTexture(Block block, String name)
    {
        registerBlockTexture(block, 0, name);
    }

Une petite explication (code venant de Superloup10) :

Les trois paramètres, “item”/“block” est l’item/block concerné, “metadata” correspond à la damage value/metadata (quand le paramètre est absent la valeur vaut 0), name vous permet d’enregistrer le .json (blockstate). N’oubliez pas de changer “tuto:” par votre modid (n’enlevez pas les “:”).
Retournez dans la classe principale, dans la fonction init (FMLInitializationEvent), et ajoutez :

        proxy.registerBlockTexture(tutoBlock, "tuto_block");

tutoBlock, est le nom de votre variable, “tuto_block” est le nom de votre json.

Les json, la texture et le nom :

Nous allons enfin donner une texture à notre bloc. Allez dans votre “asset/modid” (modid correspond au dossier qui a le même nom que votre modid) et créez trois dossiers :

  • blockstates, dans ce dossier nous aurons les blocs avec leur directions et les chemins vers nos models
  • models
  • textures
    Dans le dossier blockstates, ajoutez le fichier .json (avec comme nom le nom que vous avez mis dans votre code). Dans le fichier ajoutez :
{
    "variants": {
        "normal": { "model": "MODID:tuto_block" }
    }
}

Qu’est-ce que cela veut bien dire ? Cela nous donne dans quel “dossier/fichier” le model de notre bloc est.
Remplacez MODID par votre modid et tuto_block par le nom de bloc choisi (c’est le nom des fichier .json dans models/block et models/item)
Maintenant, allez dans le dossier models et créez, à l’intérieur, ces deux dossiers :

  • block, vous mettrez dans ce dossier les rendus des blocs dans le monde, ça vous permettra de mettre la texture et de faire les rendus particuliers
  • item, dans ce dossier vous mettrez les rendus des blocs en temps qu’item
    Dans le dossier block, ajoutez un fichier .json qui porte le nom que vous avez mis dans le premier fichier .json (pour moi ce sera : tuto_block).
    Dans le fichier .json ajoutez :
{
    "parent": "block/cube_all",
    "textures": {
        "all": "MODID:blocks/tuto_block"
    }
}

Petite description ?

"parent": "block/cube_all
Correspond au fichier .json (dans "models/block"), dont il reprend le modèle. C'est le modèle des blocs simples. Le deuxième bout de code : 
    "textures": {
        "all": "MODID:blocks/tuto_block"
    }

Cela correspond à l’accès de la texture pour savoir quelle texture le bloc aura (comme en 1.7 le .setBlockTextureName()). Remplacez le “MODID” par votre modid et le “tuto_block” par le nom de la texture de votre bloc (vos textures pour les blocs seront à placer dans textures/blocks).
Une fois ceci fait, dans le dossier item, ajoutez encore un fichier .json (du même nom que dans le dossier “models/block”), une fois que vous l’avez fait, ajoutez dans le fichier .json :

{
    "parent": "MODID:block/tuto_block",
    "display": {
        "thirdperson": {
            "rotation": [ 10, -45, 170 ],
            "translation": [ 0, 1.5, -2.75 ],
            "scale": [ 0.375, 0.375, 0.375 ]
        }
    }
}

Donc, comme plus haut, le parent correspond à quel bloc il prend le modèle, mais dans ce .json, il faudra mettre votre .json créés précédemment. Ensuite, le reste du code nous permet de dessiner l’item dans l’inventaire…
N’oubliee pas de remplacer le “MODID” par votre modid et “tuto_block” par le nom de votre .json (du dossier “models/block”).

Maintenant, dans le dossier textures, créez un dossier blocks et mettez y la texture du bloc (elle doit être au format de pixel hauteur*largeur, à une puissance de deux soit : 1, 2, 4, 8, 16, 32, 64…). N’oubliez pas de la nommer comme vous l’avez fait dans les fichiers plus haut (rappel : “textures”: { “all”: “MODID:blocks/tuto_block” };en jaune il s’agit du nom de la texture).

Normalement, si vous n’avez rien raté, en lançant votre jeu, votre bloc aura la texture que vous lui aurez attribuée. Mais, tout de fois, vous verrez que votre bloc a un nom bizarre (tile.nom_du_block.name), donc dans votre fichier .lang (dans le dossier lang), vous devez mettre :

tile.nom_du_block.name=Nom Du Block

Bien sûr, remplacez “nom_du_block” par le vrai nom de votre bloc (rappel : .setUnlocalizedName()), et “Nom Du Block” par le nom que vous voulez lui donner en jeu.
Maintenant lancez votre jeu et votre bloc aura le nom que vous lui aurez donné.

Résultat

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

En vidéo

https://www.youtube.com/watch?v=ws8j0ZxYZYg

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

retourSommaire des tutoriels