Structure ou arbre géant :)
-
Bonjour, c’est à nouveau moi, vous savez, le ninja :D.
Donc voila, suite à votre aide j’ai donc réussi à faire des spawn des arbres sur mon biome mais j’aimerias que ces arbres soient géants.
Pour ce faire j’utilise cette fonction :
public WorldGenerator getRandomWorldGenForTrees(Random par1Random) { return (WorldGenerator)(par1Random.nextInt(4) == 0 ? new WorldGenTrees(false, 25, 2, 2, false) : (par1Random.nextInt(3) == 0 ? this.worldGeneratorBigTree : new WorldGenTrees(false, 25, 0, 0, false))); }
Mais en changeant la valeur “25” les arbres ne sont quand même pas très grand, même si j’essaye de mettre 80 par exemple.
donc je sais pas si c’est possible d’avoir de très grands arbres.
J’ai donc également pensé à faire des structures d’artbres, mais ça serait un peu lourd donc j’ai essayé quand même de faire des tests comme ça :
if ((world.isAirBlock(x, y + 1, z))) { world.setBlock(x , y, z, Blocks.log); world.setBlock(x+1 , y, z, Blocks.log); world.setBlock(x+2 , y, z, Blocks.log); world.setBlock(x , y, z + 1, Blocks.log); world.setBlock(x+1 , y, z +1, Blocks.log); world.setBlock(x+2 , y, z+1, Blocks.log); world.setBlock(x , y, z+2, Blocks.log); world.setBlock(x+1 , y, z+2, Blocks.log); world.setBlock(x+2 , y, z+2, Blocks.log); }
Lors de mes tests, cela fonctionne,ça spawn partout (j’ajusterais les conditions) mais j’aimerais savoir comment faire pour une boucle qui générerait les différents étages de l’arbre, car la ça ne fait qu’une couche et je me vois pas copier cela pour les 80 blocs de hauteurs ^^
autre questions concernant la structure, comment en faire plusieurs et avoir un random entre les deux, par exemple faire deux arbres différents et que les deux puissent spawn.
Voila, merci je pense avoir été précis, si jamais je le suis pas assez, je vous laisse me poser vos questions
Et aussi, autre question, comment faire pour qu’une échelle soit posé directement sur un bloc lors de la génération de mon arbre. car pour le moment, elle essaye de se place a la place d’un bloc, donc elle est drop et non posé
-
Pour ta structure d’arbre géant, Minecraft ne doit pas s’occuper du cas où on change la hauteur de l’arbre géant du coup il faut créer la structure soit-même. Du coup je te conseillerai de te créer une API (que je peux te créer si tu veux ça m’éclatera :P, mais je pense que ça peut être interéssant pour toi de la créer), qui aurait une fonction qui prend en compte world, x, y, z, height (hauteur) et tu fais un algorithme qui génère l’arbre,
Idée:
(Mon code doit donner un rendu correct si l’hauteur fournie est supérieur à 10 (sinon il n’y avait qu’à générer un bigTree de base de Minecraft ^^ !))
public static void createBigTree(World world, int x, int y, int z, short height) { // Besoin de la Classe Random (aléatoire) pour que l'arbre ne soit pas similaire ;) Random random = new Random(); int rand = 0; // Boucle qui va créer l'arbre couche horizontal par couche horizontal, je m'inspire de la structure Minecraft pour la "forme" de l'arbre (tronc puis gros feuillage avec bois) for(int couche = 0; couche < height; couche++) { // Si c'est les premiers blocs on ne fait que générer un tronc droit (forme de base de Minecraft) if(couche < 5) world.setBlock(x, y + couche, z, Blocks.log); // Travail et condition exceptionnel pour formé la base de l'énorme feuillage else if(couche == 5) { // On génère une couche 5 qui a environ 7 blocs de large (comme base de l'arbre) for(int cX = x - 4; cX < 8; cX++) for(int cZ = z - 4; cZ < 8; cZ++) { rand = random.nextInt(2); if(rand == 0) world.setBlock(cX, y + couche, cZ, Blocks.log); // Tu peux aussi rajouter une fonction setLog qui pose une bûche dans un sens aléatoire je ne sais plus comment on fait des metadatas déjà :P else if(rand == 1) world.setBlock(cX, y + couche, cZ, Blocks.leaves); // Sinon vide (rand == 2) } } // On se base sur les couches précédentes qui vont donc permettre de former les couches supérieurs et qu'il y est donc une certaine cohérence entre les couches (qu'un tronc ne se coupe pas soudainement…) else { // TODO: J'ai un peu la flemme après avoir pondu tout ça de t'expliquer mais tu check si bûche dans rayon de 2 et alors tu poses avec un random de 3 (donc pas de pose obligatoire, 0 == Bûche, 1 == feuillage, 2 == néant) } } }
La génération pouvant mettre des blocs qui ne vont pas rester (feuillage à plus de deux cubes d’une bûche), je te conseille si tu prends ma technique de faire une fonction vérification ou d’améliorer ma condition else if(couche == 5) comme le else
- Mon code fonctionne avec l’indentation fait bien attention sinon rajoute les { }
En espérant ne pas trop t’avoir macher le travail Ca m’a fait plaisir
@‘sventus’:
autre questions concernant la structure, comment en faire plusieurs et avoir un random entre les deux, par exemple faire deux arbres différents et que les deux puissent spawn.
Et aussi, autre question, comment faire pour qu’une échelle soit posé directement sur un bloc lors de la génération de mon arbre. car pour le moment, elle essaye de se place a la place d’un bloc, donc elle est drop et non posé
Précises un peu mieux les deux autres questions et sinon je crois que poser des échelles sur feuillage = impossible donc ne try hard pas x)
-
Je voulais mettre les échelles sur le tronc car c’est un tronc en cercle (jai fait les setblock). Et je voulais faire plusieurs structure A et B. Puis que dans le biome ça soit le À et le B qui spawn
Merci beaucoup en tout cas, je regarde tout ça ce soir
-
Si tu places l’échelles après avoir placé le bloc sur laquelle elle repose elle devrait tenir.
Attention à bien mettre le bon metadata pour qu’elle soit dans la bonne direction. -
Je pense que cela devrait t’aider pour trouver les bon metadata ^^
public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) { int j1 = metadata; if((j1 == 0 || side == 2) && world.isSideSolid(x, y, z + 1, ForgeDirection.NORTH)) { j1 = 2; } if((j1 == 0 || side == 3) && world.isSideSolid(x, y, z - 1, ForgeDirection.SOUTH)) { j1 = 3; } if((j1 == 0 || side == 4) && world.isSideSolid(x + 1, y, z, ForgeDirection.WEST)) { j1 = 4; } if((j1 == 0 || side == 5) && world.isSideSolid(x - 1, y, z, ForgeDirection.EAST)) { j1 = 5; } return j1; }
-
Bonjour, désolé j’ai été indisponible un petit moment, donc voila, j’ai essayé ta méthode Benjamin Loison mais la variable i, je l’initialise à 0 ? et le random.randInt(2) n’est pas reconnu
-
Alors je crois que Benjamin s’est un tout petit peu trompé, remplace i par couche, et c’est random.nextInt(2);
Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk
-
Oui, excusez-moi quand j’écris un code comme ça, je ne vérifie pas les fonctions, mais il n’y a qu’à mettre le . et sur Eclipse vous cherchez une fonction assez équivalente
EDIT: J’ai edit mon algorithme