MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Générer une structure

    Planifier Épinglé Verrouillé Déplacé La génération & les dimensions
    1.7.x
    67 Messages 21 Publieurs 32.2k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • ÜberfapÜ Hors-ligne
      Überfap
      dernière édition par robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • Code
        • La classe principale
        • La classe de génération
        • La classe de la structure
      • Bonus
      • Résultat
      • En vidéo
      • Crédits

      Introduction

      Dans ce tutoriel, nous allons apprendre comment générer une structure. Une structure est un ensemble de blocs générés automatiquement dans le monde qui peuvent avoir plusieurs utilités (Décoration, coffre, etc…). On peut par exemple prendre l’exemple du village PNJ ou encore des mineshafts, donjons, etc…

      Pré-requis

      • Créer la base de votre mod.
      • Savoir générer des minerais (car nous partirons sur les mêmes principes).

      Code

      La classe principale :

      Tout d’abord, rendez-vous dans votre classe principale.
      à la suite de vos variables de blocs, d’items, etc… ajoutez ceci :

      StructureGenerator structureGenerator = new StructureGenerator();
      

      Vous aurez une erreur sur la déclaration, c’est normal, vous n’avez pas encore créé cette classe !
      Puis, dans la méthode preInit(), ajoutez ceci :

      GameRegistry.registerWorldGenerator(structureGenerator, 0);
      

      Vous aurez encore une erreur sur registerWorldGenerator(), ne vous en faites pas nous allons régler ça !

      Ce sera tout pour la classe principale !

      La classe de génération :

      Créez tout d’abord la classe StructureGenerator dans un nouveau package que j’appellerais gen pour génération.
      Vous devriez avoir ceci :

      public class StructureGenerator
      {
      
      }
      

      Pour pouvoir générer des choses dans notre monde (et plus précisément des structures), il suffit d’ajouter une interface à cette classe : l’interface IWorldGenerator !
      Faites le donc, vous devriez obtenir ceci:

      import cpw.mods.fml.common.IWorldGenerator;
      
      public class StructureGenerator implements IWorldGenerator
      {
      
      }
      

      Vous aurez une erreur sur le nom de la classe, c’est tout à fait normal, passez le curseur dessus et cliquez sur “Add Unimplemented Methods”.
      Vous aurez une nouvelle méthode nommée generate() qui va nous permettre de… générer 😛

      public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
      {
      
      }
      

      Explication des paramètres:

      • Random: pour trouver une valeur de génération au hasard.
      • chunkX, chunkY, chunkZ: les coordonnées du chunk.
      • chunkGenerator, chunkProvider: des classes liées aux chunks que nous n’allons pas utiliser dans ce tutoriel.
        Comme nous voulons que notre classe soit polyvalente et puisse générer des structures dans n’importe quelle dimension, nous allons faire un petit switch sur l’id de la dimension en question:
      switch (world.provider.dimensionId)
      {
      case -1:
          generateNether(world, random, chunkX * 16, chunkZ * 16);
          break;
      case 0:
          generateSurface(world, random, chunkX * 16, chunkZ * 16);
          break;
      case 1:
          generateEnd(world, random, chunkX * 16, chunkZ * 16);
          break;
      }
      

      Votre classe finale devrait ressembler à ceci:

      import java.util.Random;
      
      import net.minecraft.world.World;
      import net.minecraft.world.chunk.IChunkProvider;
      import cpw.mods.fml.common.IWorldGenerator;
      
      public class StructureGenerator implements IWorldGenerator
      {
      
          public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
          {
              switch (world.provider.dimensionId)
              {
              case -1:
                  generateNether(world, random, chunkX * 16, chunkZ * 16);
                  break;
              case 0:
                  generateSurface(world, random, chunkX * 16, chunkZ * 16);
                  break;
              case 1:
                  generateEnd(world, random, chunkX * 16, chunkZ * 16);
                  break;
              }
      
          }
      
          private void generateSurface(World world, Random random, int i, int j)
          {
      
          }
      
          private void generateNether(World world, Random random, int i, int j)
          {
      
          }
      
          private void generateEnd(World world, Random random, int i, int j)
          {
      
          }
      }
      

      (Merci à agabou pour la structure du switch et les méthodes de générations).

      Ce sera tout pour l’instant, maintenant vous pouvez quitter cette classe.

      La classe de la structure :

      Pour créer notre structure, nous allons créer une nouvelle classe et nous allons faire hériter cette même classe de la classe WorldGenerator, comme ceci :

      import java.util.Random;
      
      import net.minecraft.world.World;
      import net.minecraft.world.chunk.IChunkProvider;
      import net.minecraft.world.gen.feature.WorldGenerator;
      import cpw.mods.fml.common.IWorldGenerator;
      
      public class WorldGenTotem extends WorldGenerator
      {
          public boolean generate(World world, Random rand, int x, int y, int z)
          {
              return false;
          }
      }
      

      Maintenant, tâchons de créer notre première structure ! Elle devrait ressembler à ça :

      0_1529759620143_1404996275-2014-07-10-14-42-21.png

      (Comme vous les voyez, c’est assez inratable).

      Maintenant, pour générer ça, rien de plus simple, ajoutez simplement ceci:

      world.setBlock(x, y, z, Blocks.cobblestone);
      world.setBlock(x, y + 1, z, Blocks.cobblestone);
      world.setBlock(x, y + 2, z, Blocks.sponge);
      

      (N’oubliez pas de changer le return false en return true, sinon votre génération ne marchera pas).

      Et c’est tout pour cette classe ! Pour finaliser le tout, rendez vous dans la classe StructureGeneration précédemment créée, et ajoutez dans la méthode generateSurface():

      int x1 = x + random.nextInt(16);
      int y1 = random.nextInt(128);	
      int z1 = z + random.nextInt(16);	
      (new WorldGenTotem()).generate(world, random, x1, y1, z1);
      

      Et voila !

      Bonus

      Générer au dessus d’un bloc défini :

      Imaginons que vous vouliez que votre structure se génère uniquement au dessus d’un bloc de sable, comment faire ?
      Eh bien c’est assez simple, il suffit de vérifier le bloc en dessous avant de générer !

      public boolean generate(World world, Random rand, int x, int y, int z)
      {
          if (world.getBlock(x, y - 1, z) == Blocks.sand)
          {
              world.setBlock(x, y, z, Blocks.cobblestone);
              world.setBlock(x, y + 1, z, Blocks.cobblestone);
              world.setBlock(x, y + 2, z, Blocks.sponge);
              return true;
          }
          return false;
      }
      

      Simple, mais pas tellement…
      En effet, ce code est fonctionnel, mais il ne convient pas du tout à notre objectif, qui est de générer une structure en surface, puisque les structures peuvent aussi générer sous terre! De plus, si on laissait ce bout de code tel qu’il est, le taux de génération baissera énormément !

      Nous allons donc pallier à ces deux problèmes!

      Pour faire en sorte que les structures génèrent uniquement à l’air libre, il suffit de vérifier que le bloc au dessus est de l’air, et ainsi de suite!

      public boolean generate(World world, Random rand, int x, int y, int z)
      {
          if (world.getBlock(x, y - 1, z) == Blocks.sand && world.isAirBlock(x, y + 1, z)
          {
              world.setBlock(x, y, z, Blocks.cobblestone);
              world.setBlock(x, y + 1, z, Blocks.cobblestone);
              world.setBlock(x, y + 2, z, Blocks.sponge);
              return true;
          }
          return false;
      }
      

      Ceci règle notre premier problème, quand au deuxième, il suffit d’ajouter un boucle for avant de générer la structure dans le StructureGenerator 😉

      private void generateSurface(World world, Random random, int x, int z)
      {
          int x1 = x + random.nextInt(16);
          int y1 = random.nextInt(128);
          int z1 = z + random.nextInt(16);
          for (int i = 0; i < 500; i++) // Il vaut mieux mettre une valeur élevée 
          {
              (new WorldGenTotem()).generate(world, random, x1, y1, z1);
          }
      }
      

      Et voilà ! Vous savez maintenant comment générer une structure au dessus d’un bloc défini!

      Générer dans un biome défini :

      Nous allons apprendre dans cette partie comment générer la structure dans un biome en particulier !

      Il suffit de vérifier le biome et de mettre la boucle for!

      private void generateSurface(World world, Random random, int x, int z)
      {
          int x1 = x + random.nextInt(16);
          int y1 = random.nextInt(128);
          int z1 = z + random.nextInt(16);
          for (int i = 0; i < 500; i++)
          {
              if (world.getBiomeGenForCoords(x1, z1) == BiomeGenBase.desert)
              {
                  (new WorldGenTotem()).generate(world, random, x1, y1, z1);
              }
          }
      }
      

      Tadam ! Vous pouvez maintenant générer votre structure dans le biome de votre choix !

      Faire spawner un monstre dans votre structure :

      Pour cet exemple je vais spawner un creeper au dessus du bloc d’éponge.

      Dans la classe WorldGenTotem:

      @Override
      public boolean generate(World world, Random random, int x, int y, int z)
      {
          if (!world.isRemote)
              {
              world.setBlock(x, y, z, Blocks.cobblestone);
              world.setBlock(x, y + 1, z, Blocks.cobblestone);
              world.setBlock(x, y + 2, z, Blocks.sponge);
              EntityCreeper creeper = new EntityCreeper(world);
              creeper.setPosition(x, y + 3, z);
              world.spawnEntityInWorld(creeper);
              return true;
          }
          return false;
      }
      

      Et voila 🙂

      Résultat

      0_1529759545767_1407533222-2014-08-08-23-21-13.png

      Crédits

      Rédaction :

      • AlphaSwittleTeam

      Correction :

      • Fine33

      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

      Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
      Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

      1 réponse Dernière réponse Répondre Citer 0
      • Fine33F Hors-ligne
        Fine33
        dernière édition par

        Excellent tuto ! Mais est-il possible de faire en sorte qu’un certain mob spawn dans la structure ?

        Mes mods :

        Agriculcraft

        #L'âge ne fait pas le mod.(L'âge ne fait pas le mod.)

        1 réponse Dernière réponse Répondre Citer 0
        • robin4002R Hors-ligne
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
          dernière édition par

          Par contre, si il n’y a pas de vidéo, il faudrait retiré la partie vidéo.

          1 réponse Dernière réponse Répondre Citer 0
          • ÜberfapÜ Hors-ligne
            Überfap
            dernière édition par

            @Fine: Je pense que c’est possible, je vais essayer 😉
            @Robin: Je vais filmer la vidéo bientôt 🙂

            Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
            Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

            1 réponse Dernière réponse Répondre Citer 0
            • robin4002R Hors-ligne
              robin4002 Moddeurs confirmés Rédacteurs Administrateurs
              dernière édition par

              D’accord, tu veux les accès à la chaine youtube ? Si oui, il me faudrait ton email.

              1 réponse Dernière réponse Répondre Citer 0
              • ÜberfapÜ Hors-ligne
                Überfap
                dernière édition par

                MP 🙂

                Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
                Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

                1 réponse Dernière réponse Répondre Citer 0
                • Fine33F Hors-ligne
                  Fine33
                  dernière édition par

                  Ah, un dernier truc ^^ Comment faire spawner un coffre avec certains items en randomisation dedans ?

                  Mes mods :

                  Agriculcraft

                  #L'âge ne fait pas le mod.(L'âge ne fait pas le mod.)

                  1 réponse Dernière réponse Répondre Citer 0
                  • isadorI Hors-ligne
                    isador Moddeurs confirmés Modérateurs
                    dernière édition par

                    regarde le code de génération des coffre dans les mineshaft

                    1 réponse Dernière réponse Répondre Citer 0
                    • DiangleD Hors-ligne
                      Diangle
                      dernière édition par

                      @‘isador34’:

                      regarde le code de génération des coffre dans les mineshaft

                      Il passe par une classe annexe, il te faut créer une classe hériter de ChestGenHooks et de recréer se qui faut après regarde dans le donjons (moins complexe que le mineshaft).

                      1 réponse Dernière réponse Répondre Citer 0
                      • robin4002R Hors-ligne
                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                        dernière édition par

                        world.isAirBlock(x, y, z) n’est pas la pour rien. (tutoriel modifié).

                        1 réponse Dernière réponse Répondre Citer 0
                        • M Hors-ligne
                          MrAzErTy31
                          dernière édition par

                          Excellent tutoriel :D, donc si je comprends bien, on peu générer par exemple des plantes sur la grass ? (Ce n’est pas que pour les grosses structures)

                          Mes mods :

                          >! GGButtonMod : http://minecraftforgefrance.fr/showthread.php?tid=1280
                          CraftYourMenu : http://minecraftforgefrance.fr/showth…

                          1 réponse Dernière réponse Répondre Citer 0
                          • ÜberfapÜ Hors-ligne
                            Überfap
                            dernière édition par

                            Merci 😄 Oui en effet, on peux générer de l’herbe avec ça 😉

                            Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
                            Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

                            1 réponse Dernière réponse Répondre Citer 0
                            • M Hors-ligne
                              MrAzErTy31
                              dernière édition par

                              Ah vraiment bien 😄

                              Mes mods :

                              >! GGButtonMod : http://minecraftforgefrance.fr/showthread.php?tid=1280
                              CraftYourMenu : http://minecraftforgefrance.fr/showth…

                              1 réponse Dernière réponse Répondre Citer 0
                              • FlowF Hors-ligne
                                Flow
                                dernière édition par

                                Super tuto et très utile ! Maintenant pour ce qui est de très grande structure existe t-il des logiciels permettant de créer son “donjon” et ensuite de l’exporter en JAVA ?

                                Oui ce gif est drôle.

                                1 réponse Dernière réponse Répondre Citer 0
                                • M Hors-ligne
                                  MrAzErTy31
                                  dernière édition par

                                  Il me semble avoir vu un logiciel pour convertir ses .schematic en Java, je crois que c’était sur les Minecraft Forums.

                                  Mes mods :

                                  >! GGButtonMod : http://minecraftforgefrance.fr/showthread.php?tid=1280
                                  CraftYourMenu : http://minecraftforgefrance.fr/showth…

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • FlowF Hors-ligne
                                    Flow
                                    dernière édition par

                                    Merci j’ai trouver je pense voici pour ceux que cela intéresse 😄

                                    http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1263960-1-3-2-updated-metadata-support-simple-schematic

                                    Oui ce gif est drôle.

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • ÜberfapÜ Hors-ligne
                                      Überfap
                                      dernière édition par

                                      ça ne marcheras pas, ce logiciel était prévu dans la partie bonus avant de me rendre compte qu’il ne marche pas en 1.7 😞

                                      Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
                                      Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • Superloup10S Hors-ligne
                                        Superloup10 Modérateurs
                                        dernière édition par

                                        Le logiciel fonctionne, il donne juste du code erroné car il n’a pas été mis à jour depuis longtemps.

                                        Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                        Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • M Hors-ligne
                                          MrAzErTy31
                                          dernière édition par

                                          Le code est vraiment érroné où il suffit juste de changer la fonction (les coordonnées et les blocs y sont) ?

                                          Mes mods :

                                          >! GGButtonMod : http://minecraftforgefrance.fr/showthread.php?tid=1280
                                          CraftYourMenu : http://minecraftforgefrance.fr/showth…

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • robin4002R Hors-ligne
                                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                            dernière édition par

                                            Changer la fonction + ajouter ,3

                                            1 réponse Dernière réponse Répondre Citer 0
                                            • 1
                                            • 2
                                            • 3
                                            • 4
                                            • 1 / 4
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            ContactMentions Légales

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB