Aller au contenu
mathmatboy

[1.7.x] Générer un block (type minerai)

Recommended Posts

Générer un block (type minerai)

-[iNTRODUCTION]-

Dans ce tutoriel, je vais vous montrer comment générer un bloc grâce l'api de forge.

-[sOMMAIRE]-

1] Explications

2] Résultat final

1] Explications

Dirigeons nous vers notre classe principale pourdéclarez la classe GeneratorOreMod :

GeneratorOreMod eventGeneratorManager = new GeneratorOreMod();

Une erreur va apparaître sur les mots GeneratorOreMod, c'est tout à fait normal puisque nous n'avons pas encore créé cette classe.

Allez maintenant dans votre fonction preInit et enregistrez ceci :

GameRegistry.registerWorldGenerator(eventGeneratorManager, 0);

Le 0 est le poids de notre générateur (plus il est grand plus tard sera effectuée la génération).

Maintenant, nous allons créer notre classe GeneratorOreMod.

On vaimplémenter la classe IWorldGenerator comme ceci :

import cpw.mods.fml.common.IWorldGenerator;

public class GeneratorOreMod implements IWorldGenerator {

}

L'erreur qui apparaît demande la déclaration explicite d'une méthode (generate), ce que nous allons faire :

@Override
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);
        case 0: 
            generateSurface(world, random, chunkX * 16, chunkZ * 16);
        case 1: 
            generateEnd(world, random, chunkX * 16, chunkZ * 16);
    }
}

Ceci sert à différentier ma génération de notre minerai dans les 3 dimensions qui sont le nether, le monde normal et l'end. Les 16 représentent la longueur et la largeur d'un chunk dans minecraft.

Il faut bien sûr créer ces méthodes :

private void generateNether(World world, Random random, int x, int z) 
{
	
}

private void generateEnd(World world, Random random, int x, int z) 
{

}
	
private void generateSurface(World world, Random random, int x, int z) 
{

}

Nous allons ajouter une méthode pour nous simplifier la vie (Ctrl + Shift + O pour résoudre les erreurs d'import) :

/**
 * Génère le bloc passé en argument.
 * 
 * @param block Le type de bloc à générer.
 * @param world Le monde dans lequel il faut le générer.
 * @param random Objet random pour calculer au hasard la position des filons.
 * @param blockXPos Position X de la génération.
 * @param blockZPos Position Z de la génération.
 * @param maxX Position X maximale dans le chunk.
 * @param maxZ Position Z maximale dans le chunk.
 * @param maxVeinSize La taille maximale d'un filon.
 * @param chancesToSpawn Le nombre de filons par chunk.
 * @param minY La hauteur minimum d'un filon.
 * @param maxY La hauteur maximum d'un filon.
 */
public void addOreSpawn(Block block, World world, Random random, int blockXPos, int blockZPos, int maxX, int maxZ, int maxVeinSize, int chancesToSpawn, int minY, int maxY)
{
	int maxPossY = minY + (maxY - 1);
	assert maxY > minY: "La hauteur maximum doit être plus grande que la hauteur minimum.";
	assert maxX > 0 && maxX <= 16: "La plus grande position X doit être entre 0 et 16.";
	assert minY > 0: "La hauteur minimum doit être plus grande que 0.";
	assert maxY < 256 && maxY > 0: "La hauteur maximum doit être entre 0 et 256.";
	assert maxZ > 0 && maxZ <= 16: "La plus grande position X doit être entre 0 et 16.";

	int diffBtwnMinMaxY = maxY - minY;
	for(int x = 0; x < chancesToSpawn; x++)
	{
		int posX = blockXPos + random.nextInt(maxX);
		int posY = minY + random.nextInt(diffBtwnMinMaxY);
		int posZ = blockZPos + random.nextInt(maxZ);
		(new WorldGenMinable(block, maxVeinSize)).generate(world, random, posX, posY, posZ);
	}
}

Petit rappel sur les assertions :

Une instruction d'assertion permet de vérifier la validité d'une valeur.

Dans l'exemple suivant, on veut vérifier la validité d'un numéro de téléphone stocké sous forme de String dans une variable numero.

assert numero.charAt(0) == '0';

Ce code génére une erreur si le premier caractère de la chaîne numero n'est pas un "0".

Par exemple, si je fais :

String numero = "01.23.45.67.89";
assert numero.charAt(0) == '0';

System.out.println("Assertion passée");

L'instruction System.out.println sera executée sans problème. En revanche, si je fais :

String numero = "COUCOU";
assert numero.charAt(0) == '0';

System.out.println("Assertion passée");

L'instruction System.out.println ne sera pas executée et une erreur sera affichée dans la console :

Exception in thread "main" java.lang.AssertionError

On peut également ajouter un message dans l'instruction assert :

assert numero.charAt(0) == '0' : "Le numéro est invalide.";;

Et l'erreur sera la suivante :

Exception in thread "main" java.lang.AssertionError: Le numéro est invalide.

Pour activer les assertions lors du lancement d'un programme, ajoutez "-ea" à la commande java (ou dans la case VM arguments d'Eclipse).

Puis, grâce à cette méthode et dans une des 3 que nous avons créée, on peut générer notre bloc :

this.addOreSpawn(Blocks.bedrock, world, random, x, z, 16, 16, 3, 2, 10, 20);

Ce code génèrera 2 filons de bloc de bedrock par chunk. Ces filons comporteront 3 blocs maximum, et seront situés entre les couches 10 et 20.

2] Code final

Au final, le code final est :


import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenMinable;
import cpw.mods.fml.common.IWorldGenerator;


public class WorldGeneratorMod implements IWorldGenerator
{
 @Override
 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);
   case 0:
    generateSurface(world, random, chunkX * 16, chunkZ * 16);
   case 1:
    generateEnd(world, random, chunkX * 16, chunkZ * 16);
  }
 }

 private void generateNether(World world, Random random, int x, int z)
 {

 }

 private void generateEnd(World world, Random random, int x, int z)
 {

 }

 private void generateSurface(World world, Random random, int x, int z)
 {
  this.addOreSpawn(Blocks.bedrock, world, random, x, z, 16, 16, 3, 2, 10, 20);
 }

 /**
  * Génère le bloc passé en argument.
  *
  * @param block Le type de bloc à générer.
  * @param world Le monde dans lequel il faut le générer.
  * @param random Objet random pour calculer au hasard la position des
  * filons.
  * @param blockXPos Position X de la génération.
  * @param blockZPos Position Z de la génération.
  * @param maxX Position X maximale dans le chunk.
  * @param maxZ Position Z maximale dans le chunk.
  * @param maxVeinSize La taille maximale d'un filon.
  * @param chancesToSpawn Le nombre de filons par chunk.
  * @param minY La hauteur minimum d'un filon.
  * @param maxY La hauteur maximum d'un filon.
  */
 public void addOreSpawn(Block block, World world, Random random, int blockXPos, int blockZPos, int maxX, int maxZ, int maxVeinSize, int chancesToSpawn, int minY, int maxY)
 {
  int maxPossY = minY + (maxY - 1);
  assert maxY > minY : "La hauteur maximum doit être plus grande que la hauteur minimum.";
  assert maxX > 0 && maxX <= 16 : "La plus grande position X doit être entre 0 et 16.";
  assert minY > 0 : "La hauteur minimum doit être plus grande que 0.";
  assert maxY < 256 && maxY > 0 : "La hauteur maximum doit être entre 0 et 256.";
  assert maxZ > 0 && maxZ <= 16 : "La plus grande position X doit être entre 0 et 16.";

  int diffBtwnMinMaxY = maxY - minY;
  for (int x = 0; x < chancesToSpawn; x++)
  {
   int posX = blockXPos + random.nextInt(maxX);
   int posY = minY + random.nextInt(diffBtwnMinMaxY);
   int posZ = blockZPos + random.nextInt(maxZ);
   (new WorldGenMinable(block, maxVeinSize)).generate(world, random, posX, posY, posZ);
  }
 }
}

-- Correction et mise en page par Wytrem le 27/05/2015.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×