Générer une structure
-
Existe t-il d’autres logiciels pour la conversion de Shematics en JAVA compatible avec la 1.7 ?
-
Je ne crois pas.
-
Bonjour, j’ai suivi le tuto (et utilisé mon expérience passée) et j’ai créé une structure. Problème :
Alors que le code de génération s’exécute (tests au System.out.print), la structure ne se génère pas.
Un peu d’aide ?DragonsWorldGenerator :
public class DragonsWorldGenerator implements IWorldGenerator { private static boolean hasGeneratedDungeon = false; @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId) { /*case 1: this.generateEnd(world, chunkX * 16, chunkZ * 16, random);*/ case 0: this.generateSurface(world, chunkX * 16, chunkZ * 16, random); /*case -1: this.generateNether(world, chunkX * 16, chunkZ * 16, random);*/ } } private void generateSurface(World world, int x, int z, Random random) { // Sera migré vers generateNether if(hasGeneratedDungeon == false) { hasGeneratedDungeon = true; (new WorldGenNetherDungeon()).generate(world, random, x + 10, 128 /*Valeur de test*/, z +10); } } private void generateNether(World world, int x, int z, Random random) { } private void generateEnd(World world, int x, int z, Random random) { } }
WorldGenNetherDungeon :
import java.util.Random; import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; public class WorldGenNetherDungeon extends WorldGenerator { @Override public boolean generate(World world, Random rand, int x, int y, int z) { if(world.getBlock(x, y - 1, z) == Blocks.air) { clearZone(world, rand, x, y, z); generateGround(world, rand, x, y, z); generateFort(world, rand, x, y, z); System.out.println("[Dragons][Normal] GENERATED THE STRUCTURE."); // Test return true; } return false; } public void clearZone(World world, Random rand, int x, int y, int z) { // Caché ;p utilisation des world.setBlockToAir(x, y, z); } public void generateGround(World world, Random rand, int x, int y, int z) { // Caché ;p utilisation des world.setBlock(x, y, z, Blocks.block) } public void generateFort(World world, Random rand, int x, int y, int z) { generateTowers(world, rand, x, y, z); generateFloor1(world, rand, x, y, z); } public void generateTowers(World world, Random rand, int x, int y, int z) { // Caché ;p } public void generateFloor1(World world, Random rand, int x, int y, int z) { // Caché ;p } }
-
if(!hasGeneratedDungeon) { hasGeneratedDungeon = (new WorldGenNetherDungeon()).generate(world, random, x + 10, 128 /*Valeur de test*/, z +10); }
Fait comme ça.
-
Cette fois, le jeu me renvoie une erreur : [Rapport trop long pour ce message] https://www.mediafire.com/?lxitifcn3p4mmi6
(Désolé je verrais un peu plus tard pour Github) -
Forcement, tu n’as pas mit des valeurs random, et comme il n’y pas réussi à faire spawn sur les coordonnés que tu as donnés (surement car il n’y a pas d’air) ça a fait une boucle infini …
Et pour les gros logs, pastebin, mediafire c’est horrible u_U.
-
Oui mais ça continue à crasher (en y pensant, c’est logique, c’est pas des coordonnées qui vont faire crasher. Si ?).
De plus, là où la structure devait se générer (tests), les blocs n’atteignaient pas plus de la couche 79….EDIT : Il semble que ce soit l’utilisation du “hasGeneratedDungeon” qui fasse tout bugger.
EDIT II : Ma structure se génère normalement.
EDIT III : Je note que ça laggue beaucoup pendant le chargement du monde (après spawn, bugs de chunk de plusieurs minutes) est-ce que quelqu’un connaîtrai une technique moins lourde que des for() et des setblock ? -
@‘MrBlockTNT’:
Oui mais ça continue à crasher (en y pensant, c’est logique, c’est pas des coordonnées qui vont faire crasher. Si ?).
Si.
Regarde bien ce que tu as fait. La fonction generateSurface est appelé régulièrement, et toi tu essayes de faire spawner la structure sur des coordonnées fixes. Sauf que la fonction generate de WorldGenNetherDungeon ne return que true si la structure a été généré, donc si tu mets des coordonnés fixe où il n’y a pas d’air, il va essayer à chaque fois de le générer.Pour les grosses structures (mines abandonnés, forts) minecraft utilise un autre code mais il est plus difficile à comprendre.
-
Ah d’accord ! Merci je vais regarder pour le code Minecraft de base et voir pour les coordonnées (EDIT : ça marche merci :))
-
Je ne veux pas du tout critiquer ce tutoriel loin de la, mais je trouve qu’il manque cruellement d information. Par exemple, tu ne précise pas comment générer des block directionnelle comme les escalier, des blocks “double” comme les porte ou le lits. Tu ne stipules pas non plus comment générer des block container tels que des dispenser ou des coffres ou encore comment générer des éclairs ou des cochons avec une selle. Tu devrais aussi mettre un exemple plus concret qu’un totem de trois block une maison par exemple pour ainsi parler de la boucle for qui se trouve être tes utiles dans la génération.
bonne continuation ;).
-
@‘Legrandfifou’:
Existe t-il d’autres logiciels pour la conversion de Shematics en JAVA compatible avec la 1.7 ?
oui je ne sais pas si c’est le schematic to java initial qui a ete repris ou un autre mais regardez et il fonctione 1.7 et est regulierement mis a jour http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1266014-0-4b-jajo_11s-schematic-to-structure-converter
-
Oh merci je vais ajouter ça dans la partie bonus
-
@‘Portuar’:
Je ne veux pas du tout critiquer ce tutoriel loin de la, mais je trouve qu’il manque cruellement d information. Par exemple, tu ne précise pas comment générer des block directionnelle comme les escalier, des blocks “double” comme les porte ou le lits. Tu ne stipules pas non plus comment générer des block container tels que des dispenser ou des coffres ou encore comment générer des éclairs ou des cochons avec une selle. Tu devrais aussi mettre un exemple plus concret qu’un totem de trois block une maison par exemple pour ainsi parler de la boucle for qui se trouve être tes utiles dans la génération.
bonne continuation ;).
Pour les blocs* directionnels*, ça ne change pas vraiment du setBlock normal, il me semble qu’il faut utiliser setBlockWithMetadata() un truc comme ça, pour les blocs doubles je n’ai pas essayé mais je pense qu’un simple setBlock() suffit, les containers ils faut faire un setBlock() normal, pour les éclairs c’est dans la partie spawner une entité, et pour spawner un cochon avec une selle c’est pas censé être un tutoriel sur comment customiser des entités, mais il faut modifier une valeur dans le dataWatcher de l’entité. Je n’ai pas fait une grosse structure parce que le code devient très vite confus, de toutes les façons pour générer de grosses structures il vaut mieux utiliser des outils tiers (dont un sur lequel je vais faire une partie bonus). Et merci de ton commentaire
-
J’ai essayer de le faire en 1.8 sauf que le setblock ne marche pas.
package fr.darkvince.mine; import java.util.Random; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.world.World; public class WorldGenZombie { public boolean generate(World worldIn, Random random, int x, int y, int z) { if (!worldIn.isRemote) { worldIn.setBlock(x, y, z, Blocks.cobblestone); worldIn.setBlock(x, y + 1, z, Blocks.cobblestone); worldIn.setBlock(x, y + 2, z, Blocks.sponge); EntityCreeper creeper = new EntityCreeper(worldIn); creeper.setPosition(x, y + 3, z); worldIn.spawnEntityInWorld(creeper); return true; } return false; } }
-
@‘darkvince37’:
J’ai essayer de le faire en 1.8 sauf que le setblock ne marche pas.
package fr.darkvince.mine; import java.util.Random; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.world.World; public class WorldGenZombie { public boolean generate(World worldIn, Random random, int x, int y, int z) { if (!worldIn.isRemote) { worldIn.setBlock(x, y, z, Blocks.cobblestone); worldIn.setBlock(x, y + 1, z, Blocks.cobblestone); worldIn.setBlock(x, y + 2, z, Blocks.sponge); EntityCreeper creeper = new EntityCreeper(worldIn); creeper.setPosition(x, y + 3, z); worldIn.spawnEntityInWorld(creeper); return true; } return false; } }
Utilise le setBlockState et Blocks.cobblestone.getDefaultState
-
.getDefaultState ne marche pas
-
@‘darkvince37’:
.getDefaultState ne marche pas
Quel est le problème ? La fonction n’existe pas ? Je peux pas vraiment t’aider plus que ça : je n’ai pas eclipse à porté de main. Mais ça doit être quelque chose comme ça vu que je l’ai utilisé dans mon mod il y a quelques semaines.
-
getDefaultState cannot be resolved or is not a field voilà l"erreur
-
@‘darkvince37’:
getDefaultState cannot be resolved or is not a field voilà l"erreur
c’est peut-être quelque chose comme new Block(Blocks.cobblestone).getDefaultState, si c’est pas ça, cherche cette fonction dans Block.class, Blocks.class, BlockPos.class et World.class, c’est forcément dans l’une d’elle.
-
Attend car en fait le getDefaultState il faut mettre () a la fin. sauf qui veutr ajouter un null devant tous