Créer un Biome



  • Sommaire

    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

    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 :

    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

    retourRetour vers le sommaire des tutoriels



  • Ce tuto peut marché en 1.7?


  • Administrateurs

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



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