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 |
| { |
| |
| private final int minTreeHeight; |
| |
| private final boolean vinesGrow; |
| |
| private final int metaWood; |
| |
| 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; |
| } |
| } |
| } |
| |