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 :
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 -
Ce tuto peut marché en 1.7?
-
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
-
dans leau?car si oui c’est normal
-
et dans l’image il l’a retiré