Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Utiliser les BlockStates

    Les blocs
    1.12.x
    1
    1
    1897
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • BrokenSwing
      BrokenSwing Moddeurs confirmés Rédacteurs last edited by robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • Code
        • Avant les blockstates
        • Avec les blockstates
        • Les propriétés
        • Les métadatas
      • Crédits

      Introduction

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

      Pré-requis

      • Créer un bloc

      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

      1 Reply Last reply Reply Quote 1
      • 1 / 1
      • First post
        Last post
      Design by Woryk
      Contact / Mentions Légales / Faire un don

      MINECRAFT FORGE FRANCE © 2018

      Powered by NodeBB