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