[1.7.2]Creation d'un arbre personnalisé…



  • Bonsoir !

    Oui, je sais, c'est encore moi…vous allez dire "il sait pas ce débrouiller, il est nul..." vous avez entièrement raison mais plus vite je vous demanderais les choses dont j'ai besoin, plus vite je vous laisserais tranquille et je serais capable de développer des mods de manière autonomne.

    Bref, passons au vif du sujet -> Je voudrais créer un nouvel arbre, j'ai trouvé un tuto pour cela pour la version 1.6.4 de minecraft ici, mais il est dans les tutos non validés donc...je préfères ne pas me réferer à celui-ci....

    Ensuite, je vous préviens que j'ai déja cherché sur Google (notre ami à tous), et j'ai trouvé plusieurs tutos mais qui n'étaient que pour la 1.5.2 et y en pas beaucoup en Français en plus. Non pas que je n'ai point de compétence dans cette langue, mais bon, quand il est question de code que je ne connais pas, je préfère partir sur des valeurs sures et ne pas faire d'erreurs à cause de mauvaises traductions.

    Donc, est-ce que vous connaitriez par hasard un bon tuto qui explique comment creer un arbre en 1.7.2 ? Ou alors, si impossibilité, est-ce que la méthode pour la 1.5.2 ou 1.6.4 pourrait aller ???

    Oui, car aprés avoir analyser les nombreuses classes, je penses qu'il faut utiliser pour cela celles qui s'appellent:
    "BlockLog.class"; "BlockLeaves.class" et "BlockSapling.class" mais aprés, je suis encore un peu dans le flou de ce qu'il faut faire par la suite (bien que j'ai peut-être une petite idée pour le début).

    Merci,
    BBCmh3



  • Regarde dans le code de la sapling, il doit avoir un truc comme onGrow



  • Bonjour,

    Merci ! Bien que je n'ai pas encore réussi…



  • public void func_149878_d(World p_149878_1_, int p_149878_2_, int p_149878_3_, int p_149878_4_, Random p_149878_5_)
    

    Cette fonction est celle qui gère tout ça. Malheureusement, elle n'est pas "traduite", donc difficile a comprendre. Cependant, on peut voir qu'elle utilise des classe comme "WorldGenForest"

    Essaie de te pencher sur ça



  • D'accord, merci pour l'aide !
    Je vais essayer de voir cela demain soir aprés les cours ! 😄



  • Bonsoir, grâce à Kevin_68 et à toi, j'ai réussi à créer mon arbre et à faire pour que quand on utilise de la poudre d'os sur la pousse de mon arbre, celle-ci devient l'arbre en question…..

    En revanche, je n'arrives toujours pas à générer l'arbre à la création du monde : j'ai beau regarder partout sur les map générées, il n'y a nul part mon arbre...
    Je vous passes le code :

    Ma classe bbcmh3LightsWood :

    package bbcmh3.common;
    
    import java.util.List;
    import net.minecraft.block.BlockLog;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.IBlockAccess;
    
    public class bbcmh3LightsWood extends BlockLog
    {
    private IIcon topIcon;
    
    public bbcmh3LightsWood()
    {
    super();
    }
    
    @Override
    public void registerBlockIcons(IIconRegister iconregister)
    {
    blockIcon = iconregister.registerIcon(this.getTextureName());
    topIcon = iconregister.registerIcon(this.getTextureName() + "_top");
    }
    
    @Override
    public IIcon getIcon(int side, int metadata)
    {
    int k = metadata & 12;
    return k == 0 && (side == 1 || side == 0) ? topIcon : (k == 4 && (side == 5 || side == 4) ? topIcon : (k == 8 && (side == 2 || side == 3) ? topIcon : blockIcon));
    }
    
    @SuppressWarnings({"unchecked", "rawtypes"})
    
    @Override
    public void getSubBlocks(Item item, CreativeTabs creativeTabs, List list)
    {
    list.add(new ItemStack(item, 1, 0));
    }
    
    @Override
    public boolean canSustainLeaves(IBlockAccess world, int x, int y, int z)
    {
    return true;
    }
    
    @Override
    public boolean isWood(IBlockAccess world, int x, int y, int z)
    {
    return true;
    }
    }
    

    La classe bbcmh3LightsLeaves :

    package bbcmh3.common;
    
    import java.util.List;
    import java.util.Random;
    import net.minecraft.block.BlockLeaves;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    import net.minecraftforge.common.IShearable;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    public class bbcmh3LightsLeaves extends BlockLeaves implements IShearable
    {
    protected IIcon fastIcon;
    public static final String[] types = new String[] {"lights"};
    
    public bbcmh3LightsLeaves()
    {
    super();
    this.setLightOpacity(1);
    }
    
    @Override
    public void registerBlockIcons(IIconRegister iconregister)
    {
    blockIcon = iconregister.registerIcon(this.getTextureName());
    fastIcon = iconregister.registerIcon(this.getTextureName() + "_opaque");
    }
    
    @Override public boolean isOpaqueCube()
    {
    return Blocks.leaves.isOpaqueCube();
    }
    
    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockAccess blockaccess, int x, int y, int z, int side)
    {
    return !this.isOpaqueCube() ? true : super.shouldSideBeRendered(blockaccess, x, y, z, side);
    }
    
    @Override
    public IIcon getIcon(int side, int metadata)
    {
    return(isOpaqueCube() ? fastIcon : blockIcon);
    }
    
    @SuppressWarnings({"rawtypes", "unchecked"})
    
    @Override
    public void getSubBlocks(Item item, CreativeTabs creativeTabs, List list)
    {
    list.add(new ItemStack(item, 1, 0));
    }
    
    @Override
    public boolean isLeaves(IBlockAccess world, int x, int y, int z)
    {
    return true;
    }
    
    @SideOnly(Side.CLIENT)
    
    @Override
    public int getBlockColor()
    {
    return -1;
    }
    
    @SideOnly(Side.CLIENT)
    
    @Override
    public int getRenderColor(int par1)
    {
    return -1;
    }
    
    @Override
    public int quantityDropped(Random random)
    {
    return random.nextInt(20) == 0 ? 1 : 0;
    }
    
    @Override
    public Item getItemDropped(int metadata, Random random, int par3)
    {
    return Item.getItemFromBlock(bbcmh3lights.bbcmh3LightsSaplings);
    }
    
    @Override
    public void dropBlockAsItemWithChance(World world, int x, int y, int z, int metadata, float par6, int par7)
    {
    if(!world.isRemote)
    {
    if(world.rand.nextInt(20) == 0)
    {
    Item splingid = this.getItemDropped(metadata, world.rand, par7);
    this.dropBlockAsItem(world, x, y, z, new ItemStack(splingid, 1, this.damageDropped(metadata)));
    }
    
    }
    
    }
    
    @Override
    public int colorMultiplier(IBlockAccess blockaccess, int x, int y, int z)
    {
    return -1;
    }
    
    @Override
    public String[] func_150125_e()
    {
    return types;
    }
    }
    
    

    La classe bbcmh3LightsSaplings :

    package bbcmh3.common;
    import java.util.List;
    import java.util.Random;
    import net.minecraft.block.BlockSapling;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.World;
    import net.minecraft.world.gen.feature.WorldGenerator;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    public class bbcmh3LightsSaplings extends BlockSapling
    {
    public bbcmh3LightsSaplings()
    {
    super();
    float f = 0.4F;
    setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
    }
    
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata)
    {
    return blockIcon;
    }
    
    @Override
    public void func_149878_d(World world, int x, int y, int z, Random random)
    {
    int l = world.getBlockMetadata(x, y, z) & 3;
    world.setBlockToAir(x, y, z);
    Object obj = null;
    obj = new WorldGenLightsTree(false);
    if(!((WorldGenerator)(obj)).generate(world, random, x, y, z))
    {
    world.setBlock(x, y, z, this, l, 3);
    }
    }
    
    @SideOnly(Side.CLIENT)
    
    @Override
    public void getSubBlocks(Item item, CreativeTabs creativetabs, List list)
    {
    list.add(new ItemStack(item, 1, 0));
    }
    
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister iiconRegister)
    {
    this.blockIcon = iiconRegister.registerIcon(this.getTextureName());
    }
    }
    

    En enfin, la classe WorldGenLightsTree:

    
    package bbcmh3.common;
    
    import java.util.Random;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockSapling;
    import net.minecraft.init.Blocks;
    import net.minecraft.util.Direction;
    import net.minecraft.world.World;
    import net.minecraft.world.gen.feature.WorldGenAbstractTree;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class WorldGenLightsTree extends WorldGenAbstractTree
    {
    /** The minimum height of a generated tree. */
    private final int minTreeHeight;
    /** True if this tree should grow Vines. */
    private final boolean vinesGrow;
    /** The metadata value of the wood to use in tree generation. */
    private final int metaWood;
    /** The metadata value of the leaves to use in tree generation. */
    private final int metaLeaves;
    private static final String __OBFID = "CL_00000438";
    
    public WorldGenLightsTree(boolean par1)
    {
    this(par1, 4, 0, 0, false);
    }
    
    public WorldGenLightsTree(boolean par1, int par2, int par3, int par4, boolean par5)
    {
    super(par1);
    this.minTreeHeight = par2;
    this.metaWood = par3;
    this.metaLeaves = par4;
    this.vinesGrow = par5;
    }
    
    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
    {
    int l = par2Random.nextInt(3) + this.minTreeHeight;
    boolean flag = true;
    
    if (par4 >= 1 && par4 + l + 1 <= 256)
    {
    byte b0;
    int k1;
    Block block;
    
    for (int i1 = par4; i1 <= par4 + 1 + l; ++i1)
    {
    b0 = 1;
    
    if (i1 == par4)
    {
    b0 = 0;
    }
    
    if (i1 >= par4 + 1 + l - 2)
    {
    b0 = 2;
    }
    
    for (int j1 = par3 - b0; j1 <= par3 + b0 && flag; ++j1)
    {
    for (k1 = par5 - b0; k1 <= par5 + b0 && flag; ++k1)
    {
    if (i1 >= 0 && i1 < 256)
    {
    block = par1World.getBlock(j1, i1, k1);
    
    if (!this.isReplaceable(par1World, j1, i1, k1))
    {
    flag = false;
    }
    }
    else
    {
    flag = false;
    }
    }
    }
    }
    
    if (!flag)
    {
    return false;
    }
    else
    {
    Block block2 = par1World.getBlock(par3, par4 - 1, par5);
    
    boolean isSoil = block2.canSustainPlant(par1World, par3, par4 - 1, par5, ForgeDirection.UP, (BlockSapling)bbcmh3lights.bbcmh3LightsSaplings);
    if (isSoil && par4 < 256 - l - 1)
    {
    block2.onPlantGrow(par1World, par3, par4 - 1, par5, par3, par4, par5);
    b0 = 3;
    byte b1 = 0;
    int l1;
    int i2;
    int j2;
    int i3;
    
    for (k1 = par4 - b0 + l; k1 <= par4 + l; ++k1)
    {
    i3 = k1 - (par4 + l);
    l1 = b1 + 1 - i3 / 2;
    
    for (i2 = par3 - l1; i2 <= par3 + l1; ++i2)
    {
    j2 = i2 - par3;
    
    for (int k2 = par5 - l1; k2 <= par5 + l1; ++k2)
    {
    int l2 = k2 - par5;
    
    if (Math.abs(j2) != l1 || Math.abs(l2) != l1 || par2Random.nextInt(2) != 0 && i3 != 0)
    {
    Block block1 = par1World.getBlock(i2, k1, k2);
    
    if (block1.isAir(par1World, i2, k1, k2) || block1.isLeaves(par1World, i2, k1, k2))
    {
    this.setBlockAndNotifyAdequately(par1World, i2, k1, k2, bbcmh3lights.bbcmh3LightsLeaves, this.metaLeaves);
    }
    }
    }
    }
    }
    
    for (k1 = 0; k1 < l; ++k1)
    {
    block = par1World.getBlock(par3, par4 + k1, par5);
    
    if (block.isAir(par1World, par3, par4 + k1, par5) || block.isLeaves(par1World, par3, par4 + k1, par5))
    {
    this.setBlockAndNotifyAdequately(par1World, par3, par4 + k1, par5, bbcmh3lights.bbcmh3LightsWood, this.metaWood);
    
    }
    }
    
    return true;
    }
    else
    {
    return false;
    }
    }
    }
    else
    {
    return false;
    }
    }
    }
    
    

  • Administrateurs

    Bone meal -> il y a un event pour.
    Génération -> il faut passer par un générateur du même type que pour les minerais.



  • Pour le bone meal, c'est bon, ça ça fonctionnait déja…
    Par contre, merci pour la génération,je re-regardes cela toutà l'heure... 🙂



  • si vous avez besoin aller dans la section tutoriel en attente de validation ^^



  • Bonsoir,

    Oui, merci pour ce bon tuto Diangle ! 🙂
    Néanmoins, j'avais fini par trouver moi-même comment les générer…mais ton tuto reste tout de même bien ! 😛