Utiliser les BlockStates


  • Rédacteurs

    Sommaire

    Introduction

    Le but de ce tutoriel est que vous soyez capable de créer des blocs avec plusieurs variantes.

    Pré-requis

    Code

    Avant les blockstates :

    Dans les versions antérieures à la 1.8 les blockstates n'existaient pas, pour différencier les différentes variations d'un bloc nous utilisions les métadatas. Cependant ces dernières n'étaient que très peu explicites :
    Exemple :
    Je veux une laine de couleur jaune, mais comment puis-je savoir la métada associée à cette couleur ?

    En voilà une question, mais vous connaissant je suis sûr que vous allez me répondre :
    Mais c'est très simple, il te suffit de te rendre ici et hop, on voit que la métadata de la laine jaune c'est 4.

    Alors, oui, ces metadatas se trouvent sur Internet mais c'est premièrement pas très pratique et deuxièmement on ne les trouve que pour les blocs de Minecraft, c'est à dire que si je veux connaître la métadata associée à un bloc d'un certain mod il est très peu probable que je trouve cette information.

    Avec les blockstates :

    À partir de la 1.8 les blockstates ont été ajoutés, c'est-à-dire que Minecraft a décidé de mettre un nom pour chaque variante de bloc. Donc si je reviens à mon exemple :
    Exemple :
    Je veux une laine de couleur jaune, mais comment puis-je savoir la métadata associée à cette couleur ?

    Et là je vous réponds tout simplement :
    Plus besoin de métadata, nous avons maintenant des noms, je vais juste prendre la laine avec le nom color=yellow.

    Mais voyons tout ceci un peu plus en détail...

    Les propriétés :

    Si nous rentrons plus en détail dans le fonctionnement des blockstates, nous observons que les blocs ayant plusieurs variantes ont ce que l'on appelle des propriétés. Par exemple, la laine possède une propriété color qui peut avoir plusieurs valeurs (orange, magenta, yellow, white, white_blue, etc ...).

    Comme vous pouvez le voir, tout ceci semble très logique. Prenons encore un exemple car c'est important de comprendre ce que représentent les propriétés, cette fois je vais prendre la porte. Voici les propriétés de la porte et les valeurs que peuvent prendre celles-ci :

    Nom de la propriété Valeurs que peut prendre la propriété
    half upper, lower
    facing north, east, south, west
    open true, false
    hinge left, right
    powered true, false

    Comme vous pouvez le voir, il peut y avoir un certain nombre de propriétés.
    Il existe plusieurs types de propriétés déjà existants mais on peux créer ses propres propriétés très facilement. Allez, je vais vous faire une très petite liste :

    • PropertyBool
    • PropertyInteger
    • PropertyEnum
    • PropertyDirection

    Pour ajouter une propriété à votre bloc il vous faut tout d'abord instancier celle-ci, utilisez le constructeur (les arguments sont assez clairs) et placez l'instance de celle-ci où vous voulez (dans la classe de votre bloc peut-être). Comme vous allez toujours utiliser la même instance de la propriété vous devriez la déclarer static et final (et public car c'est possible que vous utilisiez la même propriété pour différents blocs).
    Il faut bien comprendre que l'instance d'une propriété ne contient en aucun cas la valeur de celle-ci donc elle peut être commune à plusieurs blocs sans problème.

    Donc vous avez à présent l'instance de votre propriété, mais votre bloc ne sait toujours pas qu'il doit l'utiliser, il va bien falloir le prévenir. C'est tout l'intérêt de la fonction Block#createBlockState, vous devez retourner une instance de BlockStateContainer, son constructeur demande une instance de Block et une liste de propriétés (IProperty). Comme vous pouvez vous en douter pour l'instance du bloc nous allons utiliser this pour faire référence à l'instance de notre bloc, et pour la liste de propriétés nous allons créer une liste contenant toutes nos propriétés.

    Les métadatas :

    Aïe, je ne vous ai jamais dit que l'on s'était débarrassé des métadatas, j'ai juste dit que l'on avait mis un nom sur ces dernières. En effet il va aussi falloir que vous indiquiez à Minecraft comment passer d'une métadata à un état de bloc et vice-versa (je vous rappelle que vous ne pouvez avoir que 16 valeurs pour les métadatas). Pour ceci nous allons ré-écrire les fonctions Block#getMetaFromState(IBlockState state) et Block#getStateFromMeta(int meta).

    Pour retourner un état de bloc, utilisez Block#getDefaultState puis utilisez IBlockState#withProperty(IProperty<t>, V) pour changer la valeur de vos propriétés. Voici par exemple une partie de la classe du four :

    
    public static final PropertyDirection FACING = BlockHorizontal.FACING;
    
    /**
    * Convert the given metadata into a BlockState for this Block
    */
    public IBlockState getStateFromMeta(int meta)
    {
        EnumFacing enumfacing = EnumFacing.getFront(meta);
    
        if (enumfacing.getAxis() == EnumFacing.Axis.Y)
        {
            enumfacing = EnumFacing.NORTH;
        }
    
        return this.getDefaultState().withProperty(FACING, enumfacing);
    }
    
    /**
    * Convert the BlockState into the correct metadata value
    */
    public int getMetaFromState(IBlockState state)
    {
        return ((EnumFacing)state.getValue(FACING)).getIndex();
    }
    
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {FACING});
    }
    
    

    A partir d'ici il ne vous reste plus qu'à vous référer à ce tutoriel pour savoir créer vos fichiers JSONs.

    (J'ai volontairement oublié de parler de IExtendedProperty).

    Crédits

    Rédaction : BrokenSwing

    Correction : Pchom

    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