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.Random; 006 007 public class BlockStem extends BlockFlower 008 { 009 /** Defines if it is a Melon or a Pumpkin that the stem is producing. */ 010 private Block fruitType; 011 012 protected BlockStem(int par1, Block par2Block) 013 { 014 super(par1, 111); 015 this.fruitType = par2Block; 016 this.setTickRandomly(true); 017 float var3 = 0.125F; 018 this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.25F, 0.5F + var3); 019 this.setCreativeTab((CreativeTabs)null); 020 } 021 022 /** 023 * Gets passed in the blockID of the block below and supposed to return true if its allowed to grow on the type of 024 * blockID passed in. Args: blockID 025 */ 026 protected boolean canThisPlantGrowOnThisBlockID(int par1) 027 { 028 return par1 == Block.tilledField.blockID; 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 super.updateTick(par1World, par2, par3, par4, par5Random); 037 038 if (par1World.getBlockLightValue(par2, par3 + 1, par4) >= 9) 039 { 040 float var6 = this.getGrowthModifier(par1World, par2, par3, par4); 041 042 if (par5Random.nextInt((int)(25.0F / var6) + 1) == 0) 043 { 044 int var7 = par1World.getBlockMetadata(par2, par3, par4); 045 046 if (var7 < 7) 047 { 048 ++var7; 049 par1World.setBlockMetadataWithNotify(par2, par3, par4, var7); 050 } 051 else 052 { 053 if (par1World.getBlockId(par2 - 1, par3, par4) == this.fruitType.blockID) 054 { 055 return; 056 } 057 058 if (par1World.getBlockId(par2 + 1, par3, par4) == this.fruitType.blockID) 059 { 060 return; 061 } 062 063 if (par1World.getBlockId(par2, par3, par4 - 1) == this.fruitType.blockID) 064 { 065 return; 066 } 067 068 if (par1World.getBlockId(par2, par3, par4 + 1) == this.fruitType.blockID) 069 { 070 return; 071 } 072 073 int var8 = par5Random.nextInt(4); 074 int var9 = par2; 075 int var10 = par4; 076 077 if (var8 == 0) 078 { 079 var9 = par2 - 1; 080 } 081 082 if (var8 == 1) 083 { 084 ++var9; 085 } 086 087 if (var8 == 2) 088 { 089 var10 = par4 - 1; 090 } 091 092 if (var8 == 3) 093 { 094 ++var10; 095 } 096 097 int var11 = par1World.getBlockId(var9, par3 - 1, var10); 098 099 if (par1World.getBlockId(var9, par3, var10) == 0 && (var11 == Block.tilledField.blockID || var11 == Block.dirt.blockID || var11 == Block.grass.blockID)) 100 { 101 par1World.setBlockWithNotify(var9, par3, var10, this.fruitType.blockID); 102 } 103 } 104 } 105 } 106 } 107 108 public void fertilizeStem(World par1World, int par2, int par3, int par4) 109 { 110 par1World.setBlockMetadataWithNotify(par2, par3, par4, 7); 111 } 112 113 private float getGrowthModifier(World par1World, int par2, int par3, int par4) 114 { 115 float var5 = 1.0F; 116 int var6 = par1World.getBlockId(par2, par3, par4 - 1); 117 int var7 = par1World.getBlockId(par2, par3, par4 + 1); 118 int var8 = par1World.getBlockId(par2 - 1, par3, par4); 119 int var9 = par1World.getBlockId(par2 + 1, par3, par4); 120 int var10 = par1World.getBlockId(par2 - 1, par3, par4 - 1); 121 int var11 = par1World.getBlockId(par2 + 1, par3, par4 - 1); 122 int var12 = par1World.getBlockId(par2 + 1, par3, par4 + 1); 123 int var13 = par1World.getBlockId(par2 - 1, par3, par4 + 1); 124 boolean var14 = var8 == this.blockID || var9 == this.blockID; 125 boolean var15 = var6 == this.blockID || var7 == this.blockID; 126 boolean var16 = var10 == this.blockID || var11 == this.blockID || var12 == this.blockID || var13 == this.blockID; 127 128 for (int var17 = par2 - 1; var17 <= par2 + 1; ++var17) 129 { 130 for (int var18 = par4 - 1; var18 <= par4 + 1; ++var18) 131 { 132 int var19 = par1World.getBlockId(var17, par3 - 1, var18); 133 float var20 = 0.0F; 134 135 if (var19 == Block.tilledField.blockID) 136 { 137 var20 = 1.0F; 138 139 if (par1World.getBlockMetadata(var17, par3 - 1, var18) > 0) 140 { 141 var20 = 3.0F; 142 } 143 } 144 145 if (var17 != par2 || var18 != par4) 146 { 147 var20 /= 4.0F; 148 } 149 150 var5 += var20; 151 } 152 } 153 154 if (var16 || var14 && var15) 155 { 156 var5 /= 2.0F; 157 } 158 159 return var5; 160 } 161 162 @SideOnly(Side.CLIENT) 163 164 /** 165 * Returns the color this block should be rendered. Used by leaves. 166 */ 167 public int getRenderColor(int par1) 168 { 169 int var2 = par1 * 32; 170 int var3 = 255 - par1 * 8; 171 int var4 = par1 * 4; 172 return var2 << 16 | var3 << 8 | var4; 173 } 174 175 @SideOnly(Side.CLIENT) 176 177 /** 178 * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called 179 * when first determining what to render. 180 */ 181 public int colorMultiplier(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 182 { 183 return this.getRenderColor(par1IBlockAccess.getBlockMetadata(par2, par3, par4)); 184 } 185 186 /** 187 * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata 188 */ 189 public int getBlockTextureFromSideAndMetadata(int par1, int par2) 190 { 191 return this.blockIndexInTexture; 192 } 193 194 /** 195 * Sets the block's bounds for rendering it as an item 196 */ 197 public void setBlockBoundsForItemRender() 198 { 199 float var1 = 0.125F; 200 this.setBlockBounds(0.5F - var1, 0.0F, 0.5F - var1, 0.5F + var1, 0.25F, 0.5F + var1); 201 } 202 203 /** 204 * Updates the blocks bounds based on its current state. Args: world, x, y, z 205 */ 206 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 207 { 208 this.maxY = (double)((float)(par1IBlockAccess.getBlockMetadata(par2, par3, par4) * 2 + 2) / 16.0F); 209 float var5 = 0.125F; 210 this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var5, 0.5F + var5, (float)this.maxY, 0.5F + var5); 211 } 212 213 /** 214 * The type of render function that is called for this block 215 */ 216 public int getRenderType() 217 { 218 return 19; 219 } 220 221 @SideOnly(Side.CLIENT) 222 223 /** 224 * Returns the current state of the stem. Returns -1 if the stem is not fully grown, or a value between 0 and 3 225 * based on the direction the stem is facing. 226 */ 227 public int getState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 228 { 229 int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); 230 return var5 < 7 ? -1 : (par1IBlockAccess.getBlockId(par2 - 1, par3, par4) == this.fruitType.blockID ? 0 : (par1IBlockAccess.getBlockId(par2 + 1, par3, par4) == this.fruitType.blockID ? 1 : (par1IBlockAccess.getBlockId(par2, par3, par4 - 1) == this.fruitType.blockID ? 2 : (par1IBlockAccess.getBlockId(par2, par3, par4 + 1) == this.fruitType.blockID ? 3 : -1)))); 231 } 232 233 /** 234 * Drops the block items with a specified chance of dropping the specified items 235 */ 236 public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) 237 { 238 super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, par7); 239 240 if (!par1World.isRemote) 241 { 242 Item var8 = null; 243 244 if (this.fruitType == Block.pumpkin) 245 { 246 var8 = Item.pumpkinSeeds; 247 } 248 249 if (this.fruitType == Block.melon) 250 { 251 var8 = Item.melonSeeds; 252 } 253 254 for (int var9 = 0; var9 < 3; ++var9) 255 { 256 if (par1World.rand.nextInt(15) <= par5) 257 { 258 float var10 = 0.7F; 259 float var11 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; 260 float var12 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; 261 float var13 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; 262 EntityItem var14 = new EntityItem(par1World, (double)((float)par2 + var11), (double)((float)par3 + var12), (double)((float)par4 + var13), new ItemStack(var8)); 263 var14.delayBeforeCanPickup = 10; 264 par1World.spawnEntityInWorld(var14); 265 } 266 } 267 } 268 } 269 270 /** 271 * Returns the ID of the items to drop on destruction. 272 */ 273 public int idDropped(int par1, Random par2Random, int par3) 274 { 275 return -1; 276 } 277 278 /** 279 * Returns the quantity of items to drop on block destruction. 280 */ 281 public int quantityDropped(Random par1Random) 282 { 283 return 1; 284 } 285 286 @SideOnly(Side.CLIENT) 287 288 /** 289 * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) 290 */ 291 public int idPicked(World par1World, int par2, int par3, int par4) 292 { 293 return this.fruitType == Block.pumpkin ? Item.pumpkinSeeds.shiftedIndex : (this.fruitType == Block.melon ? Item.melonSeeds.shiftedIndex : 0); 294 } 295 }