Générations de minerais
-
Dans ce tutoriels nous allons voir comment générer des blocs dans un monde, de la même façon qu’un minerai.
Pre-requis
Dans la classe principale
Dans la méthode init(FMLInitializationEvent) enregistrer votre WorldGenerator à l’aide de la fonction suivante :
GameRegistry.registerWorldGenerator(new WorldGeneratorTutoriel());
Ensuite créez la classe WorldGeneratorTutoriel.
La classe du générateur
Votre classe devrait ressembler à ça :
package tutoriel.common; import cpw.mods.fml.common.IWorldGenerator; public class WorldGeneratorTutoriel implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { } }
Nous allons ajouter un switch par rapport à l’id de la dimension du monde, et faire 3 fonction différentes :
switch(world.provider.dimensionId) { case -1: this.generateNether(world, chunkX * 16, chunkZ * 16, random); break; case 0: this.generateSurface(world, chunkX * 16, chunkZ * 16, random); break; case 1: this.generateEnd(world, chunkX * 16, chunkZ * 16, random); break; }
Vous n’êtes pas obligés de mettre les trois fonction, si vous souhaitez juste générer quelque chose dans le monde normal, mettez juste la case 0. Si vous avez des dimensions customs, ajoutez les cases supplémentaires.
Une fois les fonctions créées, vous devrez avoir ceci :
@Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId) { case -1: this.generateNether(world, chunkX * 16, chunkZ * 16, random); break; case 0: this.generateSurface(world, chunkX * 16, chunkZ * 16, random); break; case 1: this.generateEnd(world, chunkX * 16, chunkZ * 16, random); break; } } private void generateSurface(World world, int x, int z, Random rand) { } private void generateEnd(World world, int x, int z, Random rand) { } private void generateNether(World world, int x, int z, Random rand) { }
Pour générer un minerai, ajoutez les lignes suivantes dans la fonction du monde correspondant :
for(int i = 0; i < probabilité; i++) { (new WorldGenMinable(id du bloc à générer, metadata du bloc à générer, taille maximum d un filon, id du bloc qui va être remplacé)).generate(world, rand, x + rand.nextInt(16), rand.nextInt(hauteur maximum), z + rand.nextInt(16)); }
- probabilité : un int, pour donner un ordre de grandeur, le diamant est à 1 (enlever la boucle for revient au même que mettre 1), l’or est à 2, la redstone à 8, le gravier à 10, et le charbon, le fer et la terre à 20.
- id du bloc à générer : classePrincipale.monBloc.blockID par exemple.
- metadata du bloc à générer : je pense pas qu’il y est besoin d’explication
- taille maximum d’un filon : par combien votre minerai va se générer au maximum.
- id du bloc qui va être remplacé : sur quoi le bloc peu se générer. Par exemple Block.stone.blockID. Pour la génération dans le nether, il faut utiliser Block.netherrack.blockID ou Block.slowSand.blockID pour générer sur la soulsand. Pour l’end, Block.whiteStone.blockID pour l’end.
- hauteur maximum : la hauteur maximum où votre minerai peu se générer (diamant = 16, or = 32, fer = 64, charbon, terre et gravier = 128
Pour ceux qui se poseraient la question “Pourquoi rand.nextInt(16) et pas autres choses”
-> Car un chuck contient 16x16 blocs, avec des valeurs plus petites les minerais ne pourraient que se générer sur une parti du chunk, et avec des valeurs plus grande, ils pourraient se générer sur les chunks qui sont à côté. C’est d’ailleurs pour ça que cette valeur peut aussi jouer sur la probabilité de la génération du minerai.
Petit rappel, la fonction nextInt(int) dans Random donne au hasard un nombre entre 0 et la valeur donnée. Vous pouvez par exemple mettre “16 + rand.nextInt(16)” pour générer votre minerai entre le niveau 16 et 32.Vous pouvez également utiliser des conditions pour faire apparaitre vos minerais uniquement dans certains biomes.
if(world.getBiomeGenForCoords(x, z).equals(BiomeGenBase.field_du_biome)) { //Code de génération }
La génération de votre minerai devrait fonctionner.
Quelques exemples
private void generateSurface(World world, int x, int z, Random rand) { for(int i = 0; i < 2; i++) { (new WorldGenMinable(ModTutoriel.TutorialMetadata.blockID, 0, 4, Block.stone.blockID)).generate(world, rand, x + rand.nextInt(16), rand.nextInt(32), z + rand.nextInt(16)); } if(world.getBiomeGenForCoords(x, z).equals(BiomeGenBase.extremeHills)) { for(int i = 0; i < 8; i++) { (new WorldGenMinable(ModTutoriel.TutorialMetadata.blockID, 5, 12, Block.stone.blockID)).generate(world, rand, x + rand.nextInt(16), 16 + rand.nextInt(32), z + rand.nextInt(16)); } } }
Ici, mon bloc métadata tutoriel de metadata 0 se génère dans le monde normal, par filon de 4 au maximum sur la pierre entre le niveau (coordonnée y) 0 et 32 et se probabilité est aussi faible de l’or. Mon bloc métadata tutoriel de metadata 5 se génère dans le monde normal et uniquement dans les extreme hills (et pas dans les extreme hills edge, par filon de 12 au maximum sur la pierre entre le niveau (coordonnée y) 16 et 48 et il est aussi fréquent que la redstone.
Questions / Réponses
Q: Le tuto est pour la 1.6.2 ou la 1.6.4 ?
R: Les deux, le changement dans la génération ne concerne que les StructureComponent, pas les WorldGenerator. -
Le tuto est pour la 1.6.2 ou la 1.6.4?
-
y a des changement que pour la génération de structure en 1.6.4, conclusion se tuto est compatible avec les deux version
PS: C’est écrit dans le gros carré jaune tout en haut de la page
-
@‘utybo’:
Le tuto est pour la 1.6.2 ou la 1.6.4?
@‘0nit’:
y a des changement que pour la génération de structure en 1.6.4, conclusion se tuto est compatible avec les deux version
PS: C’est écrit dans le gros carré jaune tout en haut de la page
En effet, 1.6.2 & 4.
Le changement entre la 1.6.2 et la 1.6.4 concerne les StructureComponent, pas les WorldGenerator. -
Sympa la condition pour générer un minerai dans un biome donné ! Merci.
-
Impec ce tuto, je viens d’arriver, merci
Par contre, il y aurais moyen de faire qu’une seule fonction generate() pour tout minerai en passant par des paramètres lors de la déclaration du bloc ? -
Non, le WorldGenMinable ne permet pas de générer plusieurs minerai, il faudrait que tu créer ton propre WorldGenMianble.
-
@‘robin4002’:
Non, le WorldGenMinable ne permet pas de générer plusieurs minerai, il faudrait que tu créer ton propre WorldGenMianble.
Non, je parlais, dans le register du WorldGenerator dans la class du mod. Mais après, c’est que du plus, rien de vraiment nécéssaire.
-
Quand je lance le monde, sa me ferme minecraft et dans le crash-report sa me met:
–-- Minecraft Crash Report ----
// On the bright side, I bought you a teddy bear!Time: 16.10.13 13:49
Description: Exception in server tick loopjava.lang.NullPointerException
at archerux.WorldGeneratorTutoriel.generateSurface(WorldGeneratorTutoriel.java:32)
at archerux.WorldGeneratorTutoriel.generate(WorldGeneratorTutoriel.java:22)
at cpw.mods.fml.common.registry.GameRegistry.generateWorld(GameRegistry.java:102)
at net.minecraft.world.gen.ChunkProviderServer.populate(ChunkProviderServer.java:259)
at net.minecraft.world.chunk.Chunk.populateChunk(Chunk.java:1253)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:153)
at net.minecraft.server.MinecraftServer.initialWorldChunkLoad(MinecraftServer.java:294)
at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:90)
at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:107)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:445)
at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16)si quelqu’un peut trouver d’ou vient le problème se serait sympa.(je suis en 1.6.4)
-
Je pourrais vois ta classe “WorldGeneratorTutoriel.java”
-
Ligne 34 de WorldGeneratorTutoriel.java, quelque chose est null, il me faut les codes de ta classe.
-
D’après ce que je vois, je pense que c’est:
modarcherux.AdamantiteOre
qui pose problème. Es-tu sûr que cette variable a une valeur à ce moment du jeu ?
-
@‘jglrxavpok’:
D’après ce que je vois, je pense que c’est:
modarcherux.AdamantiteOre
qui pose problème. Es-tu sûr que cette variable a une valeur à ce moment du jeu ?
Comment sa une valeur?
-
Envoie-nous ta classe principale.
-
Je vois pourquoi x)
A chaque fois, tu recrées une variable ‘interne’ dans ta méthode Init au lieu d’affecter une valeur aux variables ^^’
-
Autrement dit:
Block AdamantiteOre
devient
AdamantiteOre
Dans la méthode init(…)
-
Merci beaucoup, cette fois-ci sa marche et sa m’a évité aussi un autre problème.
-
Bonjour,
J’aimerai savoir si il est possible de remplacer le WorldGenMinable par autre chose pour les Structures (Par exemple je crée une classe de donjon “NetherDragonDungeon” je pourrais remplacer WorldGenMinable par NetherDragonDungeon (bien sûr ce qu’il y a entre les parenthèses changera(désolé je ne me souvient plus du nom ><')) ?) -
Il existe un générateur pour les structures, StructureComponent je crois
Attention aux versions, les structures changent en 1.6.4
-
Ok, merci.