Bloc avec la même fonction que l'herbe



  • Bonjour à tous, ou enfin, rebonjour 😄

    donc voila, après de nombreuses heures d'aide, j'ai réussi à créer mon biome qui se génère. Dans ce biome, j'ai un nouveau bloc et le truc, c'est que j'aimerais que mon bloc puisse avoir des arbres qui poussent, j'ai regardé la class BlockGrass et Grass, mais je ne vois pas ou l'on parle des arbres, j'aimerais donc savoir si c'est possible, et si vous connaissiez un moyen de régler cela, merci beaucoup <3.

    cordialement,
    votre humble serviteur.



  • "Que les arbres poussent" -> c'est à dire :

    • Qu'on puisse mettre une pousse dessus ?
    • Que lors de la génération des arbres poussent de façon aléatoire ?


  • oui les deux points la, on peut mettre des pousses d'arbres, et les arbres peuvent spawn dessus naturellement.

    pour les arbres, j'ai la fonction la :

    public WorldGenerator getRandomWorldGenForTrees(Random par1Random)
    {
    return (WorldGenerator)(par1Random.nextInt(4) == 0 ? new WorldGenTrees(false, 4, 2, 2, false) : (par1Random.nextInt(3) == 0 ? this.worldGeneratorBigTree : new WorldGenTrees(false, 4, 0, 0, false)));
    }



  • Pour ça il faut ré-écrire la fonction canSustainPlant de ton block, dedans tu as une instance du block qui va être posé (IPlantable) donc soit tu utilises IPlantable instanceof BlockSapling ou tu peux récupérer un enum de type EnumPlantType qui te permet de généraliser : IPlantable.getPlantType(world, x, y, z) == EnumPlantType.Plains, à toi de voir.



  • Ok, ça doit ressembler à ça ?

    Class du Block

    package fr.craftesys.craftesys.blocs;
    
    import fr.craftesys.craftesys.common.Mods;
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockBush;
    import net.minecraft.block.material.Material;
    import net.minecraft.init.Blocks;
    import net.minecraft.world.IBlockAccess;
    import net.minecraftforge.common.EnumPlantType;
    import fr.craftesys.craftesys.generation.EnumPlanType;
    import fr.craftesys.craftesys.generation.Plantable;
    import net.minecraftforge.common.IPlantable;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class BiomeBlock extends Block  {
    
        public BiomeBlock(Material material) {
            super(material);
        }
    
    public boolean canSustainPlant(IBlockAccess world, int x, int y, int z, ForgeDirection direction,
    Plantable plantable) {
    
    Block plant = plantable.getPlant(world, x, y + 1, z);
    EnumPlanType plantType = plantable.getPlantable(world, x, y + 1, z);
    
         if (plantable instanceof ArbreBiome && ((ArbreBiome)plantable).canPlaceBlockOn(this))
         {
             return true;
         }
    
    switch (plantType)
    
        {
        case Biome: return this == Mods.biome;
    
        }
    
    return false;
    
    }
    
    }
    
    

    la class ArbreBiome :

    package fr.craftesys.craftesys.blocs;
    
    import fr.craftesys.craftesys.common.Mods;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.init.Blocks;
    import net.minecraft.world.IBlockAccess;
    import net.minecraftforge.common.EnumPlantType;
    import net.minecraftforge.common.IPlantable;
    
    public class ArbreBiome extends Block implements IPlantable {
    
    protected ArbreBiome(Material p_i45394_1_) {
    super(p_i45394_1_);
    
    }
    
    protected boolean canPlaceBlockOn(Block p_149854_1_)
        {
            return p_149854_1_ == Blocks.grass || p_149854_1_ == Blocks.dirt || p_149854_1_ == Blocks.farmland || p_149854_1_ == Mods.biome;
        }
    
    @Override
    public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) {
    
    return null;
    }
    
    @Override
    public Block getPlant(IBlockAccess world, int x, int y, int z) {
    
    return this;
    }
    
    @Override
    public int getPlantMetadata(IBlockAccess world, int x, int y, int z) {
    
    return world.getBlockMetadata(x, y, z);
    
    }
    
    }
    
    

    je pense être obligé de creer cette deuxième class, car la fonction "canPlaceBlockOn" passe de base par la class BlockBush, mais la fonction est protected, donc j'essaye de la reprendre,  mais quoiqu'il en soit, ça ne marche pas 😄



  • Pour la première classe c'est ça mais il vaut mieux utiliser une des 2 méthodes plutôt que les 2.

    Pour la 2e : dans l'idée c'est ça mais le problème c'est que ça va être la pousse qui va être plantée et non la bûche ou autre chose (ArbreBiome est censé être quel block ?)

    Sinon globalement dans l'idée c'est ça



  • la classe ArbreBiome est la class qui reprend la méthode canPlaceBlockOn qui de base est en protected dans BlockBush, donc je l'utilise pour récupérer cette méthode.

    je fais quoi du coup pour avoir le sapling dessus ?



  • j'ai fait différents tests, et rien ne change 😞



  • Est-ce que tu veux créer un nouveau type d'arbre ?
    Si oui, tu auras besoin de plusieurs blocks : le tron, la pousse (et les feuilles si tu ne veux pas celles de minecraft)

    Si non, tu n'as besoin que d'un seul block qui peut recevoir des arbres



  • Pour cette première version, je vais garder ce qui existe deja ^^ et mon block se trouve être "biome"   de la class "BiomeBlock"



  • J'ai toujours pas compris : est-ce que tu veux rajouter un arbre ou bien un bloc qui supporte les arbres ?

    mon block se trouve être "biome" de la class "BiomeBlock"-> hein ?



  • j'ai un biome qui a pour sol un biome que j'ai créé, et dans ce biome, j'aimerais avoir des arbres deja existants pouvant pousser et être généré aléatoirement sur ce bloc



  • Alors tu n'as besoin que de ré-écrire la fonction canSustainPlant pour le block qui est à la surface de ton biome



  • import fr.craftesys.craftesys.common.Mods;
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockBush;
    import net.minecraft.block.BlockSapling;
    import net.minecraft.block.material.Material;
    import net.minecraft.init.Blocks;
    import net.minecraft.world.IBlockAccess;
    import net.minecraftforge.common.EnumPlantType;
    import fr.craftesys.craftesys.generation.EnumPlanType;
    import fr.craftesys.craftesys.generation.Plantable;
    import net.minecraftforge.common.IPlantable;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class BiomeBlock extends Block  {
    
        public BiomeBlock(Material material) {
            super(material);
        }
    
    public boolean canSustainPlant(IBlockAccess world, int x, int y, int z, ForgeDirection direction,
    Plantable plantable) {
    
    boolean plantType = plantable.getPlantable(world, x, y + 1, z)== EnumPlanType.Biome ;
    
    return plantType;
    
    }
    
    }
    
    

    donc uniquement ça ??



  • Pas besoin de créer un booléen si c'est pour le retourner juste après :
    return plantable.getPlantable(world, x, y + 1, z)== EnumPlanType.Biome;

    Après tout dépend de la condition que tu veux mais juste ça suffit



  • voila ce que j'ai

    class BiomeBlock ```java
    package fr.craftesys.craftesys.blocs;

    import fr.craftesys.craftesys.common.Mods;
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockBush;
    import net.minecraft.block.BlockSapling;
    import net.minecraft.block.material.Material;
    import net.minecraft.init.Blocks;
    import net.minecraft.world.IBlockAccess;
    import net.minecraftforge.common.EnumPlantType;
    import fr.craftesys.craftesys.generation.EnumPlanType;
    import fr.craftesys.craftesys.generation.Plantable;
    import net.minecraftforge.common.IPlantable;
    import net.minecraftforge.common.util.ForgeDirection;

    public class BiomeBlock extends Block  
    {

    public BiomeBlock(Material material) {

    super(material);

    }

    public boolean canSustainPlant(IBlockAccess world, int x, int y, int z, ForgeDirection direction,
    Plantable plantable) {

    return plantable.getPlantable(world, x, y + 1, z)== EnumPlanType.Biome;

    }
    }

    
    class Plantable : ```java
    package fr.craftesys.craftesys.generation;
    
    import net.minecraft.block.Block;
    import net.minecraft.world.IBlockAccess;
    import net.minecraftforge.common.EnumPlantType;
    
    public interface Plantable
    {
    
       public EnumPlanType getPlantable(IBlockAccess world, int x, int y, int z);
       public Block getPlant(IBlockAccess world, int x, int y, int z);
       public int getPlantMeta(IBlockAccess world, int x, int y, int z);
    }
    
    

    class EnumPlanType ```java
    package fr.craftesys.craftesys.generation;

    public enum EnumPlanType {

    Biome,
    }

    
    mais ça veut toujours pas


  • Après plusieurs tests, rien ne change …



  • Normal, je suppose que tu ne sais pas ce que tu fais ? Pourquoi créer une classe Plantable et un EnumPlantType, le principe d'une fonction et d'être générale, ici tu ne ré-écris pas la fonction de Minecraft puisque ce ne sont pas les bons paramètres : supprime ces 2 classes inutiles, ensuite supprime ta fonction et fait Alt + shift + S puis Override/Implement methods et trouve la fonction canSustainPlant, une fois ça fait tu devrais voir l'annotation @Override apparaître au-dessus de ta fonction, il ne faut jamais la retirer (si eclipse te demande de la retirée c'est que tu as modifié le nom ou les paramètres de ta fonction). Une fois que tout ça est fait tu peux mettre ton code dedans



  • je comprend ce que tu veux dire, mais le problème c'est que, si je mets cela :

    @Override
    public boolean canSustainPlant(IBlockAccess world, int x, int y, int z, ForgeDirection direction,
    IPlantable plantable) {

    if (plantable == Blocks.sapling && this == Blocks.sapling)
    {
    return plantable.getPlant(world, x, y + 1, z)== EnumPlantType.Biome;

    }

    return super.canSustainPlant(world, x, y, z, direction, plantable);
    }

    en suivant ce que tu me dis, le "Biome" n'est pas reconnu car il n'existe pas dans le EnumPlantType de base.



  • Je crois que l'on peut utiliser une fonction du EnumHelper de Forge qui ajoute des entrées à lenum souhait (via réflexion), il faut refzrder de ce côté.

    Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk


Log in to reply