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