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 }