001 package net.minecraft.src; 002 003 import java.util.Random; 004 005 public class BlockMushroom extends BlockFlower 006 { 007 protected BlockMushroom(int par1, int par2) 008 { 009 super(par1, par2); 010 float var3 = 0.2F; 011 this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3); 012 this.setTickRandomly(true); 013 } 014 015 /** 016 * Ticks the block if it's been scheduled 017 */ 018 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) 019 { 020 if (par5Random.nextInt(25) == 0) 021 { 022 byte var6 = 4; 023 int var7 = 5; 024 int var8; 025 int var9; 026 int var10; 027 028 for (var8 = par2 - var6; var8 <= par2 + var6; ++var8) 029 { 030 for (var9 = par4 - var6; var9 <= par4 + var6; ++var9) 031 { 032 for (var10 = par3 - 1; var10 <= par3 + 1; ++var10) 033 { 034 if (par1World.getBlockId(var8, var10, var9) == this.blockID) 035 { 036 --var7; 037 038 if (var7 <= 0) 039 { 040 return; 041 } 042 } 043 } 044 } 045 } 046 047 var8 = par2 + par5Random.nextInt(3) - 1; 048 var9 = par3 + par5Random.nextInt(2) - par5Random.nextInt(2); 049 var10 = par4 + par5Random.nextInt(3) - 1; 050 051 for (int var11 = 0; var11 < 4; ++var11) 052 { 053 if (par1World.isAirBlock(var8, var9, var10) && this.canBlockStay(par1World, var8, var9, var10)) 054 { 055 par2 = var8; 056 par3 = var9; 057 par4 = var10; 058 } 059 060 var8 = par2 + par5Random.nextInt(3) - 1; 061 var9 = par3 + par5Random.nextInt(2) - par5Random.nextInt(2); 062 var10 = par4 + par5Random.nextInt(3) - 1; 063 } 064 065 if (par1World.isAirBlock(var8, var9, var10) && this.canBlockStay(par1World, var8, var9, var10)) 066 { 067 par1World.setBlockWithNotify(var8, var9, var10, this.blockID); 068 } 069 } 070 } 071 072 /** 073 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z 074 */ 075 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) 076 { 077 return super.canPlaceBlockAt(par1World, par2, par3, par4) && this.canBlockStay(par1World, par2, par3, par4); 078 } 079 080 /** 081 * Gets passed in the blockID of the block below and supposed to return true if its allowed to grow on the type of 082 * blockID passed in. Args: blockID 083 */ 084 protected boolean canThisPlantGrowOnThisBlockID(int par1) 085 { 086 return Block.opaqueCubeLookup[par1]; 087 } 088 089 /** 090 * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. 091 */ 092 public boolean canBlockStay(World par1World, int par2, int par3, int par4) 093 { 094 if (par3 >= 0 && par3 < 256) 095 { 096 int var5 = par1World.getBlockId(par2, par3 - 1, par4); 097 return var5 == Block.mycelium.blockID || par1World.getFullBlockLightValue(par2, par3, par4) < 13 && this.canThisPlantGrowOnThisBlockID(var5); 098 } 099 else 100 { 101 return false; 102 } 103 } 104 105 /** 106 * Fertilize the mushroom. 107 */ 108 public boolean fertilizeMushroom(World par1World, int par2, int par3, int par4, Random par5Random) 109 { 110 int var6 = par1World.getBlockMetadata(par2, par3, par4); 111 par1World.setBlock(par2, par3, par4, 0); 112 WorldGenBigMushroom var7 = null; 113 114 if (this.blockID == Block.mushroomBrown.blockID) 115 { 116 var7 = new WorldGenBigMushroom(0); 117 } 118 else if (this.blockID == Block.mushroomRed.blockID) 119 { 120 var7 = new WorldGenBigMushroom(1); 121 } 122 123 if (var7 != null && var7.generate(par1World, par5Random, par2, par3, par4)) 124 { 125 return true; 126 } 127 else 128 { 129 par1World.setBlockAndMetadata(par2, par3, par4, this.blockID, var6); 130 return false; 131 } 132 } 133 }