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 }