• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Créer un Biome

    La génération & les dimensions
    1.8
    5
    6
    5072
    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.
    • Diangle
      Diangle dernière édition par robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • Code
        • La classe principale
        • Le biome
      • Résultat
      • Crédits

      Introduction

      Bonjour à tous,
      Dans ce tutoriel nous allons créer un biome. Les biomes sont des parties du monde, ils définissent des propriétés internes comme la température, les créatures qui apparaissent, la couleur de l’herbe… Les biomes sont simples à créer, ils peuvent être ajoutés par le biais de dimensions ou de worldtypes et depuis deux simples lignes. Dans ce tutoriel nous verrons comment créer un biome et comment lui ajouter certaines propriétés.

      Pré-requis

      • Créer la base de votre mod

      Code

      La classe principale :

      Commencez par déclarer la variable de votre biome.

      public static BiomeGenBase tutoBiome;
      

      Ensuite, initialisez votre variable du biome :

      tutoBiome = new TutoBiome(50).setBiomeName("Tuto Biome").setHeight(new BiomeGenBase.Height(0.3F, 0.2F)).setTemperatureRainfall(0.4F, 1F);
      

      Nous utiliserons la classe de notre biome, le paramètre correspond à l’id du biome, je vous recommande de passer par un fichier de configuration. Ensuite, on a le nom du biome (affiché dans l’écran de debug), la hauteur/variation du biome et enfin la température et la fréquence de pluie. Vous pouvez aussi utiliser plusieurs autres fonctions (setEnableSnow() s’il neige à la place de la pluie, setDisableRain() pour désactiver la pluie…)

      BiomeManager.addBiome(BiomeType.WARM, new BiomeEntry(tutoBiome, 20));
      

      Ceci nous permet d’ajouter notre biome avec son type (premier paramètre). Dans le second paramètre on crée un nouveau BiomeEntry, les deux paramètres correspondent à la variable du biome, ainsi que le second à la génération (fréquence).

              BiomeManager.addVillageBiome(tutoBiome, true);
              BiomeManager.addStrongholdBiome(tutoBiome);
      

      Ces deux fonctions nous permettent de dire si le biome choisi peut faire apparaître des villages ou strongholds.

      BiomeManager.addSpawnBiome(tutoBiome);
      

      On fait générer notre biome. Je vous laisse regarder, mais il y a quelques autres fonctions qui peuvent vous être utiles dans la classe BiomeManager. Notamment pour supprimer des biomes…

      Le biome :

      Créez pour commencer une classe héritée de la classe BiomeGenBase. Ajoutez ensuite, le constructeur :

          public TutoBiome(int id)
          {
              super(id);
          }
      

      Dans votre constructeur vous pouvez aussi ajouter ces petites choses (leur utilité est expliquée en commentaire) :

              // La liste de spawn des créatures des cavernes (chauve-souris) que l'on vide
              this.spawnableCaveCreatureList.clear();
              // La liste de spawn des créatures de l'eau que l'on vide
              this.spawnableWaterCreatureList.clear();
              // La liste de spawn des créatures  agressives que l'on vide
              this.spawnableMonsterList.clear();
              // La liste de spawn des créatures neutres que l'on vide
              this.spawnableCreatureList.clear();
      
              // Pour ajouter un élément à une liste, ici les mobs neutres, ajoutez une SpawnListEntry(entité, probabilité, minGroupeTaille, maxGroupeTaille)
              this.spawnableCreatureList.add(new SpawnListEntry(EntitySheep.class, 10, 4, 10));
      
              // Pour ajouter une fleur (state, probabilité)
              this.addFlower(Blocks.yellow_flower.getDefaultState(), 10);// ...
      
              // Vous pouvez changer si vous voulez par autre chose que de l'herbe ou de la terre.
              this.topBlock = Blocks.grass.getDefaultState();
              this.fillerBlock = Blocks.dirt.getDefaultState();
      
              // Les options du biome, nombre de fleurs, arbres, herbes et champignons géants par chunk
              this.theBiomeDecorator.flowersPerChunk = 2;
              this.theBiomeDecorator.treesPerChunk = 4;
              this.theBiomeDecorator.grassPerChunk = 1;
              this.theBiomeDecorator.bigMushroomsPerChunk = 1;
      

      Vous pouvez aussi chercher, il se peut que dans la classe BiomeGenBase (ou BiomeDecorator…) vous trouviez une chose qui puisse vous intéresser (génération de champignon, de lac…)

          @Override
          public void genTerrainBlocks(World world, Random rand, ChunkPrimer primer, int x, int z, double noise)
          {
              this.biomeTerrain(world, rand, primer, x, z, noise);
          }
      
          private void biomeTerrain(World world, Random rand, ChunkPrimer primer, int x, int z, double noise)
          {
              boolean flag = true;
              IBlockState iblockstate = this.topBlock;
              IBlockState iblockstate1 = this.fillerBlock;
              int k = -1;
              int l = (int)(noise / 3.0D + 3.0D + rand.nextDouble() * 0.25D);
              int i1 = x & 15;
              int j1 = z & 15;
      
              for(int k1 = 255; k1 >= 0; --k1)
              {
                  if(k1 <= 1)
                  {
                      primer.setBlockState(j1, k1, i1, Blocks.bedrock.getDefaultState());
                  }
                  else
                  {
                      IBlockState iblockstate2 = primer.getBlockState(j1, k1, i1);
      
                      if(iblockstate2.getBlock().getMaterial() == Material.air)
                      {
                          k = -1;
                      }
                      else if(iblockstate2.getBlock() == Blocks.stone)
                      {
                          if(k == -1)
                          {
                              if(l <= 0)
                              {
                                  iblockstate = null;
                                  iblockstate1 = Blocks.stone.getDefaultState();
                              }
                              else if(k1 >= 59 && k1 <= 64)
                              {
                                  iblockstate = this.topBlock;
                                  iblockstate1 = this.fillerBlock;
                              }
      
                              if(k1 < 63 && (iblockstate == null || iblockstate.getBlock().getMaterial() == Material.air))
                              {
                                  if(this.getFloatTemperature(new BlockPos(x, k1, z)) < 0.15F)
                                  { //vous pouvez le changer par votre bloc choisi
                                      iblockstate = Blocks.ice.getDefaultState();
                                  }
                                  else
                                  { //vous pouvez le changer par votre bloc choisi
                                      iblockstate = Blocks.water.getDefaultState();
                                  }
                              }
      
                              k = l;
      
                              if(k1 >= 62)
                              {
                                  primer.setBlockState(j1, k1, i1, iblockstate);
                              }
                              else if(k1 < 56 - l)
                              {
                                  iblockstate = null;
                                  iblockstate1 = Blocks.stone.getDefaultState();
                                  primer.setBlockState(j1, k1, i1, Blocks.sand.getDefaultState());// je préfert le sable au gravier :P
                              }
                              else
                              {
                                  primer.setBlockState(j1, k1, i1, iblockstate1);
                              }
                          }
                          else if(k > 0)
                          {
                              --k;
                              primer.setBlockState(j1, k1, i1, iblockstate1);
                          }
                      }
                  }
              }
          }
      

      La première fonction, c’est la fonction qui sera appelée depuis le ChunkProvider, celle-ci appelle la seconde. Cette fonction vous permet de modifier la génération. Je vous laisse la modifier à votre guise (il vous faudra des connaissances en génération)

          @Override
          public void decorate(World world, Random rand, BlockPos pos)
          {
              super.decorate(world, rand, pos);
              int i = 5 + rand.nextInt(8);
              int j;
              int k;
              int l;
      
              for(j = 0; j < i; ++j)
              {
                  k = rand.nextInt(16);
                  l = rand.nextInt(28) + 4;
                  int i1 = rand.nextInt(16);
                  BlockPos blockpos1 = pos.add(k, l, i1);
      
                  if(world.getBlockState(blockpos1).getBlock().isReplaceableOreGen(world, blockpos1, BlockHelper.forBlock(Blocks.stone)))
                  {
                      world.setBlockState(blockpos1, Blocks.diamond_ore.getDefaultState(), 2);
                  }
              }
      //Vous pouvez ajouter des lacs, soit par la génération par le BiomeDecorator ou ici par la structure des lacs
      
          }
      

      Grâce à la fonction decorate, vous pouvez générer ce que vous voulez, là je génère un minerai de diamant.

          @Override
          public WorldGenAbstractTree genBigTreeChance(Random rand)
          {
              return rand.nextInt(15) == 0 ? new WorldGenMegaJungle(false, 12, 24, BlockPlanks.EnumType.OAK.getMetadata(), BlockPlanks.EnumType.OAK.getMetadata()) : new WorldGenTrees(false, 4 + rand.nextInt(4), BlockPlanks.EnumType.OAK.getMetadata(), BlockPlanks.EnumType.OAK.getMetadata(), rand.nextInt(5) == 1 ? true : false);
          }
      

      Cette fonction retourne les arbres à générer. Ici, une chance sur 15 de générer un très grand arbre sinon on génère un arbre normal cette arbre aura une chance sur 5 que des lianes pousses. Je vous laisse regarder les paramètres.

          @Override
          public WorldGenerator getRandomWorldGenForGrass(Random rand)
          {
              return rand.nextInt(10) == 0 ? new WorldGenTallGrass(BlockTallGrass.EnumType.FERN) : new WorldGenTallGrass(BlockTallGrass.EnumType.GRASS);
          }
      

      Cette fonction vous permet de générer les herbes, ici une chance sur dix de générer des doubles herbes sinon des herbes normales.

          @Override
          public int getWaterColorMultiplier()
          {
              BiomeEvent.GetWaterColor event = new BiomeEvent.GetWaterColor(this, 0xFFFFFF);
              MinecraftForge.EVENT_BUS.post(event);
              return event.newColor;
          }
      
          @Override
          public int getModdedBiomeGrassColor(int original)
          {
              BiomeEvent.GetGrassColor event = new BiomeEvent.GetGrassColor(this, 0xFFFFFF);
              MinecraftForge.EVENT_BUS.post(event);
              return event.newColor;
          }
      
          @Override
          public int getModdedBiomeFoliageColor(int original)
          {
              BiomeEvent.GetFoliageColor event = new BiomeEvent.GetFoliageColor(this, 0xFFFFFF);
              MinecraftForge.EVENT_BUS.post(event);
              return event.newColor;
          }
      

      Ces trois fonctions vous permettent de changer la couleur de l’eau, des herbes et des feuillages. Pour se faire on utilise l’event en rapport avec votre élément. La couleur est mise dans le get[…]Color(biome, couleur). Je vous conseille de mettre la couleur en hexadécimal. Ici un filtre blanc (0xFFFFFF (c’est ceci qu’il faut changer)).

      Vous n’avez plus qu’à lancer votre jeu et voir (ou admirer) votre biome.

      Résultat


      Crédits

      Rédaction :

      • Diangle

      Correction :

      • Folgansky

      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 réponse Dernière réponse Répondre Citer 0
      • leo01418
        leo01418 dernière édition par

        Ce tuto peut marché en 1.7?

        Voila ma signature

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

          Il faut juste adapter le code.
          Les BlockPos deviennent int x, int y, int, z.
          Les BlockStates deviennet des metadatas

          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
          • S
            sventus dernière édition par

            juste, ta fonction pour changer la couleur de l’eau ne marche pas

            1 réponse Dernière réponse Répondre Citer 0
            • JustAnDev
              JustAnDev dernière édition par

              dans leau?car si oui c’est normal

              s

              1 réponse Dernière réponse Répondre Citer 0
              • JustAnDev
                JustAnDev dernière édition par

                et dans l’image il l’a retiré

                s

                1 réponse Dernière réponse Répondre Citer 0
                • 1 / 1
                • Premier message
                  Dernier message
                Design by Woryk
                Contact / Mentions Légales

                MINECRAFT FORGE FRANCE © 2018

                Powered by NodeBB