    001    package net.minecraft.block;
    002
    003    import cpw.mods.fml.relauncher.Side;
    004    import cpw.mods.fml.relauncher.SideOnly;
    005    import java.util.List;
    006    import java.util.Random;
    007    import net.minecraft.creativetab.CreativeTabs;
    008    import net.minecraft.item.ItemStack;
    009    import net.minecraft.world.World;
    010    import net.minecraft.world.gen.feature.WorldGenBigTree;
    011    import net.minecraft.world.gen.feature.WorldGenForest;
    012    import net.minecraft.world.gen.feature.WorldGenHugeTrees;
    013    import net.minecraft.world.gen.feature.WorldGenTaiga2;
    014    import net.minecraft.world.gen.feature.WorldGenTrees;
    015    import net.minecraft.world.gen.feature.WorldGenerator;
    016
    017    import net.minecraftforge.event.terraingen.TerrainGen;
    018
    019    public class BlockSapling extends BlockFlower
    020    {
    021        public static final String[] WOOD_TYPES = new String[] {"oak", "spruce", "birch", "jungle"};
    022
    023        protected BlockSapling(int par1, int par2)
    024        {
    025            super(par1, par2);
    026            float var3 = 0.4F;
    027            this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3);
    028            this.setCreativeTab(CreativeTabs.tabDecorations);
    029        }
    030
    031        /**
    032         * Ticks the block if it's been scheduled
    033         */
    034        public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
    035        {
    036            if (!par1World.isRemote)
    037            {
    038                super.updateTick(par1World, par2, par3, par4, par5Random);
    039
    040                if (par1World.getBlockLightValue(par2, par3 + 1, par4) >= 9 && par5Random.nextInt(7) == 0)
    041                {
    042                    int var6 = par1World.getBlockMetadata(par2, par3, par4);
    043
    044                    if ((var6 & 8) == 0)
    045                    {
    046                        par1World.setBlockMetadataWithNotify(par2, par3, par4, var6 | 8);
    047                    }
    048                    else
    049                    {
    050                        this.growTree(par1World, par2, par3, par4, par5Random);
    051                    }
    052                }
    053            }
    054        }
    055
    056        /**
    057         * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
    058         */
    059        public int getBlockTextureFromSideAndMetadata(int par1, int par2)
    060        {
    061            par2 &= 3;
    062            return par2 == 1 ? 63 : (par2 == 2 ? 79 : (par2 == 3 ? 30 : super.getBlockTextureFromSideAndMetadata(par1, par2)));
    063        }
    064
    065        /**
    066         * Attempts to grow a sapling into a tree
    067         */
    068        public void growTree(World par1World, int par2, int par3, int par4, Random par5Random)
    069        {
    070            if (!TerrainGen.saplingGrowTree(par1World, par5Random, par2, par3, par4)) return;
    071
    072            int var6 = par1World.getBlockMetadata(par2, par3, par4) & 3;
    073            Object var7 = null;
    074            int var8 = 0;
    075            int var9 = 0;
    076            boolean var10 = false;
    077
    078            if (var6 == 1)
    079            {
    080                var7 = new WorldGenTaiga2(true);
    081            }
    082            else if (var6 == 2)
    083            {
    084                var7 = new WorldGenForest(true);
    085            }
    086            else if (var6 == 3)
    087            {
    088                for (var8 = 0; var8 >= -1; --var8)
    089                {
    090                    for (var9 = 0; var9 >= -1; --var9)
    091                    {
    092                        if (this.isSameSapling(par1World, par2 + var8, par3, par4 + var9, 3) && this.isSameSapling(par1World, par2 + var8 + 1, par3, par4 + var9, 3) && this.isSameSapling(par1World, par2 + var8, par3, par4 + var9 + 1, 3) && this.isSameSapling(par1World, par2 + var8 + 1, par3, par4 + var9 + 1, 3))
    093                        {
    094                            var7 = new WorldGenHugeTrees(true, 10 + par5Random.nextInt(20), 3, 3);
    095                            var10 = true;
    096                            break;
    097                        }
    098                    }
    099
    100                    if (var7 != null)
    101                    {
    102                        break;
    103                    }
    104                }
    105
    106                if (var7 == null)
    107                {
    108                    var9 = 0;
    109                    var8 = 0;
    110                    var7 = new WorldGenTrees(true, 4 + par5Random.nextInt(7), 3, 3, false);
    111                }
    112            }
    113            else
    114            {
    115                var7 = new WorldGenTrees(true);
    116
    117                if (par5Random.nextInt(10) == 0)
    118                {
    119                    var7 = new WorldGenBigTree(true);
    120                }
    121            }
    122
    123            if (var10)
    124            {
    125                par1World.setBlock(par2 + var8, par3, par4 + var9, 0);
    126                par1World.setBlock(par2 + var8 + 1, par3, par4 + var9, 0);
    127                par1World.setBlock(par2 + var8, par3, par4 + var9 + 1, 0);
    128                par1World.setBlock(par2 + var8 + 1, par3, par4 + var9 + 1, 0);
    129            }
    130            else
    131            {
    132                par1World.setBlock(par2, par3, par4, 0);
    133            }
    134
    135            if (!((WorldGenerator)var7).generate(par1World, par5Random, par2 + var8, par3, par4 + var9))
    136            {
    137                if (var10)
    138                {
    139                    par1World.setBlockAndMetadata(par2 + var8, par3, par4 + var9, this.blockID, var6);
    140                    par1World.setBlockAndMetadata(par2 + var8 + 1, par3, par4 + var9, this.blockID, var6);
    141                    par1World.setBlockAndMetadata(par2 + var8, par3, par4 + var9 + 1, this.blockID, var6);
    142                    par1World.setBlockAndMetadata(par2 + var8 + 1, par3, par4 + var9 + 1, this.blockID, var6);
    143                }
    144                else
    145                {
    146                    par1World.setBlockAndMetadata(par2, par3, par4, this.blockID, var6);
    147                }
    148            }
    149        }
    150
    151        /**
    152         * Determines if the same sapling is present at the given location.
    153         */
    154        public boolean isSameSapling(World par1World, int par2, int par3, int par4, int par5)
    155        {
    156            return par1World.getBlockId(par2, par3, par4) == this.blockID && (par1World.getBlockMetadata(par2, par3, par4) & 3) == par5;
    157        }
    158
    159        /**
    160         * Determines the damage on the item the block drops. Used in cloth and wood.
    161         */
    162        public int damageDropped(int par1)
    163        {
    164            return par1 & 3;
    165        }
    166
    167        @SideOnly(Side.CLIENT)
    168
    169        /**
    170         * returns a list of blocks with the same ID, but different meta (eg: wood returns 4 blocks)
    171         */
    172        public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
    173        {
    174            par3List.add(new ItemStack(par1, 1, 0));
    175            par3List.add(new ItemStack(par1, 1, 1));
    176            par3List.add(new ItemStack(par1, 1, 2));
    177            par3List.add(new ItemStack(par1, 1, 3));
    178        }
    179    }