Structure



  • Je suis en train d'essayer de crée une struture, mais je ne sais pas vraiment quoi update depuis la 1.7.10.
    J'ai pour le moment fait cela.
    Dans le preInit, je sais pas quoi faire (classe principale) J'ai rajouter cela

    StructureTuto.MainRegistry();
    

    Ma classe StructureTuto :

    package com.tuto.mod.world;
    
    import java.util.Random;
    
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.chunk.IChunkGenerator;
    import net.minecraft.world.chunk.IChunkProvider;
    import net.minecraftforge.fml.common.IWorldGenerator;
    
    public class StructureTuto implements IWorldGenerator
    {
    
        @Override
        public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider)
        {
            switch (world.provider.getDimension())
            {
            case -1:
                generateNether(world, random, chunkX * 16, chunkZ * 16);
                break;
            case 0:
                generateSurface(world, random, chunkX * 16, chunkZ * 16);
                break;
            case 1:
                generateEnd(world, random, chunkX * 16, chunkZ * 16);
                break;
            }
        }
    
        private void generateEnd(World world, Random random, int i, int j)
        {
    
        }
    
        private void generateNether(World world, Random random, int i, int j)
        {
    
        }
    
        private void generateSurface(World world, Random random, int i, int j)
        {
            int x1 = random.nextInt(16);
            int y1 = random.nextInt(128);    
            int z1 = random.nextInt(16);    
            (new Structure()).generate(world, random, x1, y1, z1);
        }
    
    }
    

    Je sais pas quoi mettre dans generateSurface.

    Et ma structure:

    package com.tuto.mod.world;
    
    import java.util.Random;
    
    import net.minecraft.init.Blocks;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.gen.feature.WorldGenerator;
    
    public class Structure extends WorldGenerator
    {
        @Override
        public boolean generate(World world, Random rand, BlockPos position)
        {
            world.setBlockState(position, Blocks.LOG.getDefaultState());
            world.setBlockState(position, Blocks.DIAMOND_BLOCK.getDefaultState());
            world.setBlockState(position, Blocks.SPONGE.getDefaultState());
            return true;
        }
    
    }
    

    Merci de vos aide futur



  • Salut,
    ton code semble correct, as-tu vu ta structure au moins ?
    (Juste qu'au final, tu ne verras qu'un seul block d'éponge, car tes 3 lignes de setBlockState use la même BlockPos, du coup, ça s'écrase à chaque fois…)



  • J'ai une erreur sur ma classe principale, le matin registry, il me demande de rajouter une méthode pour celle ci. Mais je ne Sia pas quoi mettre dedans. Et pour faire plusieurs blocks, les uns sur les autres par exemples, comment fait on ?



  • Quel tuto suis-tu ?
    La première question est difficile à répondre, mais vu le nom, je suppose que cette méthode est censé contenir le GameRegistry#registerWorldGenerator.
    Ta seconde question est "bête" et prouve que tu ne cherches pas du tout avec de venir répondre ici, c'est donc pour cette raison que je n'y répondrai pas.
    Soit tu décides de t'investir un minimum dans ton mod, quitte à perdre une vingtaine de minutes à look les classes World, BlockPos et tout..Soit tu attends patiemment dans l'espoir d'avoir un gentil membre qui te donnera le code tout prêt.


  • Administrateurs

    Salut,
    GameRegistry.registerWorldGenerator(new StructureTuto());
    et non StructureTuto.MainRegistry();



  • Je te conseillerai d'avoir quelques bases en programmation avant de coder ton mod…
    Parce que appeler StructureTuto.MainRegistry(); sans avoir de fonction MainRegistry(void) dans la classe StructureTuto, ça n'a... pas de sens 😛



  • Sans parler de la convention (du nom des classes/packages/méthodes), et puis également du fait de ne pas savoir se servir des BlockPos, qui me semblent pourtant d'une facilité infantile 😕



  • Alors deja merci de vos réponses, j'ai fait ce sujet rapidement car je n'avais pas le temps de chercher dans les classes etc. J'ai donc fait aucune recherche dans les classes de minecraft. Mais je trouve quand même blessante la réponse de Plaigon. Bien sûr que oui je sais utiliser les BlockPos !
    Et dylem, j'ai mit justement .mainRegistry mais je savais également que il me fallait cette méthode mais je ne savais pas quoi y mettre dedans !
    Celon moi, la seule réponse qui m'a servi est celle de Robin (merci :D)
    Desoler d'être aussi sec. Je n'avais seulement pas le temps de chercher, je devais faire quelque chose de plus important,
    Cordialement
    Tituya



  • Salut, je n'ai pas le sentiment d'avoir été blessant, mais je trouve ça absurde de venir affirmer qu'on sait se servir des BlockPos, alors qu'on ne connaît même pas l'existence des méthodes principales de la classes, telles que down ou up, pour décaler les coords 😕

    Ah et par ailleurs, je n'avais pas vu le début de ton message, mais c'est encore plus ridicule que le reste. Tu viens proclamer haut et fort que tu n'as fait aucune recherches, que Monsieur n'avait pas le temps d'aller voir 1 ou 2 classes (t'aurais alors "perdu" 20 minutes à tout casser), alors que c'est totalement contre le règlement. Je veux pas paraître froid ou faire le morale, mais pour un problème aussi simple à résoudre que ça, ça fait limite "profiteur" d'aller poster un sujet sur le forum….
    Et fais attention un peu à ton ton, j'ai senti à un moment de l'arrogance quand tu nous as fait signe que nos remarques ne servaient à rien. Autant dire dans ton poste principale que tu ne souhaitais l'intervention de personne, exceptée de robin.



  • Ce n'est pas du tout ce que je voulais dire ! En effet, je devais vraiment partir rapidement et précipitamment (je ne donnerais pas de raison à cela) desoler pour avoir paru arrogant mais j'étais énervé envers quelque chose et ça c'est ressenti dans mon message précédent ! Maintenant que je suis calmer, je suis près à résoudre seul ce problème ! Je suis juste partie au quart de tour ! En vous faisant regretté ce pourquoi j'étais énervé !
    Et vos remarque ne servent absolument PAS à rien ! Elles m'aide à développer et à apprendre grâce à vos réponses construites !

    Desoler d'avoir réagi comme cela.



  • Bon deja, je suis désoler mais je me tourne encore vers vous.
    Je n'y arrive vraiment pas 😕
    Je suis rendu à la position des blocks, mais je n'ai pas d'indication 😕

    J'ai une erreur ici :

    private void generateSurface(World world, Random rand, int i, int j)
    {
    int x1 = rand.nextInt(16);
    int y1 = rand.nextInt(128);
    int z1 = rand.nextInt(16);
    **(new Structure()).generate(world, rand, x1, y1, z1);**
    }
    

    Ceci est ma classe StructureTuto

    Ma classe Structure:

    public class Structure extends WorldGenerator
    {
    @Override
    public boolean generate(World world, Random rand, BlockPos position)
    {
    world.setBlockState(position.add(0, 0, 0), Blocks.LOG.getDefaultState());
    world.setBlockState(position.add(0, 1, 0), Blocks.DIAMOND_BLOCK.getDefaultState());
    world.setBlockState(position.add(0, 2, 0), Blocks.SPONGE.getDefaultState());
    return true;
    }
    
    }
    

    Elle n'a pas beaucoup changé…
    Mais là, il va y avoir un probleme dans la génération je pense mais je sait pas comment y remédier 😕
    J'ai déja essayé plusieurs choses comme ça :

    public boolean generate(World world, Random rand, BlockPos position, int x, int y, int z)
    {
    world.setBlockState(position.add(x, y, z), Blocks.LOG.getDefaultState());
    world.setBlockState(position.add(x, y + 1, z), Blocks.DIAMOND_BLOCK.getDefaultState());
    world.setBlockState(position.add(x, y + 2, z), Blocks.SPONGE.getDefaultState());
    return true;
    }
    

    Mais rien à faire, ça ne marche pas 😕

    Si vous avez du temps, pouvez vous m'indiquez comment le faire ?
    Merci


  • Administrateurs

    (new Structure()).generate(world, rand, new BlockPos(x1, y1, z1));



  • Ok merci, test ca



  • Sujet casiment fini, il me reste cependant un seul probleme, qui est bien chiant je vous l'accorde. Je souhaite faire génerer ma structure sur le sol, jusque là pas de probleme, seulement, le code a changé depuis la 1.7.10 !
    J'ai donc fait cela (qui ne fonctionne pas bien sur)
    Je comprend vraiment pas pourquoi ça ne fonctionne pas …
    Et ne dite pas que j'ai mal chercher ma structure, j'ai rajouté un system.out.printLn !

    Voila mon code actuelle :

    package com.tuto.mod.world;
    
    import java.util.Random;
    
    import com.tuto.mod.common.Tituya;
    
    import net.minecraft.init.Blocks;
    import net.minecraft.util.math.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.gen.feature.WorldGenerator;
    
    public class Structure extends WorldGenerator
    {
    @Override
    public boolean generate(World world, Random rand, BlockPos position)
    {
    if (world.getBlockState(position.down()) == Blocks.SAND && world.isAirBlock(position.up()))
    {
    world.setBlockState(position, Blocks.LOG.getDefaultState());
    world.setBlockState(position.up(), Blocks.DIAMOND_BLOCK.getDefaultState());
    world.setBlockState(position.up(2), Blocks.SPONGE.getDefaultState());
    Tituya tituya = new Tituya(world);
    tituya.setPosition(position.getX(), position.getY() + 3, position.getZ());
    world.spawnEntityInWorld(tituya);
    System.out.println("LA STRUCTURE EST GENERE");
    return true;
    }
    return false;
    }
    
    }
    

    Sans le if, elle fonctionne, étrange 😕

    Merci de vos réponses futurs.


  • Administrateurs

    Surement car la probabilité que ta structure tente de se générer dans la configuration où il y a un bloc de sable en dessous et un bloc d'air au dessus est rare.

    Il faudrait soit augmenter fortement la probabilité soit faire que lors que la structure tente de se générer à un emplacement (x, y z), faire un boucle qui augmente y jusqu'à trouver la surface et générer à ces coordonnées là.



  • J'ai pourtant générer un biome ENTIÈREMENT remplie de sable 😕 La structure ne devrait que spawner !
    Et pour la boucle, comment je fait ?



  • Je pense plutôt que c'est parce que tu compares un block et un IBlockState…
    Essaie Blocks.SAND.getDefaultState() plutôt dans ta condition



  • Je test cela 😄
    EDIT, MERCI enormement ! manque plus qu'a bossé sur l'aspect de la structure !



  • pas de soucis, hésite pas à poser des questions tant que tu fais un peu de recherche avant 🙂


  • Administrateurs

    @'Dylem':

    Je pense plutôt que c'est parce que tu compares un block et un IBlockState…
    Essaie Blocks.SAND.getDefaultState() plutôt dans ta condition

    Bien vu ! je n'avais pas fait attention à cette erreur.