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